Ну даже в урезаном варианте NQP.
Пишу я тут
компайлер PIR'а на NQP. Пока больше для развлечения. И захотелось мне данные для тестов держать в отдельных файлах. В виде:
# TEST Some test
.sub foo
.end
# TEST Another test
.sub bar
...
.end
Сначала хотел писать построчную читалку, fsm ручками и всё такое. Но потом до меня дошло, что всё это нафиг не нужно. В итоге родил такой код:
grammar TestDataGrammar {
rule TOP {
+
$ || <.panic: "Can't parse test data">
};
token testcase {
\n
}
token start { ^^ '# TEST ' }
token name { \N+ }
token body { + }
token line { > .*? \n }
};
our sub parse_tests($file)
{
pir::load_bytecode('nqp-setting.pbc');
my $data := slurp($file);
my $match := TestDataGrammar.parse($data);
$match;
}
Красота да и только!
А потом совсем обленился и написал такую функцию:
our sub run_tests_from_datafile($file)
{
my $c := pir::compreg__Ps('PIRATE');
my $tests := parse_tests($file);
for $tests -> $t {
ok(parse($c, $t), $t);
}
done_testing();
}
Теперь содержимое самого теста состоит из 2-х строчек :)
Update: поправил разметку