Skip to content

Commit

Permalink
Re-work test to use react/whenever, not earliest.
Browse files Browse the repository at this point in the history
  • Loading branch information
jnthn committed Dec 5, 2015
1 parent eddca86 commit 9828048
Showing 1 changed file with 119 additions and 126 deletions.
245 changes: 119 additions & 126 deletions integration/advent2013-day14.t
Expand Up @@ -79,143 +79,136 @@ my @currency_exchanges = (CurrencyExchange.new( :id<fast>, :delay(1) ),

{
{
my @files = qw<config1.ini config2.ini>;
my %config = read_all(@files);
is %config<font><size>, '10', 'combined config (font/size)';
is %config<font><style>, 'italic', 'combined config (font/style)';
is %config<font><color>, 'red', 'combined config (font/color)';
is %config<line><style>, 'dashed', 'combined config (line/style)';
my @files = qw<config1.ini config2.ini>;
my %config = read_all(@files);
is %config<font><size>, '10', 'combined config (font/size)';
is %config<font><style>, 'italic', 'combined config (font/style)';
is %config<font><color>, 'red', 'combined config (font/color)';
is %config<line><style>, 'dashed', 'combined config (line/style)';
}

sub read_all(@files) {
my $read = Channel.new;
my $parsed = Channel.new;
read_worker(@files, $read);
parse_worker($read, $parsed);
my %all_config = await config_combiner($parsed);
$read.close; $parsed.close;
return %all_config;
my $read = Channel.new;
my $parsed = Channel.new;
read_worker(@files, $read);
parse_worker($read, $parsed);
my %all_config = await config_combiner($parsed);
$read.close; $parsed.close;
return %all_config;
}

sub read_worker(@files, $dest) {

# simulated slurp()
sub Slurp($name) {
my %files = (
'config1.ini' => q:to"END1",
[font]
size = 10
style = italic
[line]
style = dashed
END1
'config2.ini' => q:to"END2",
[font]
color = red
[line]
height = 0.5
END2
);
return %files{$name}
}

start {
for @files -> $file {
$dest.send( Slurp($file) );
}
$dest.close();
CATCH { diag 'read_worker failure:' ~ $_; $dest.fail($_) }
}
# simulated slurp()
sub Slurp($name) {
my %files = (
'config1.ini' => q:to"END1",
[font]
size = 10
style = italic
[line]
style = dashed
END1
'config2.ini' => q:to"END2",
[font]
color = red
[line]
height = 0.5
END2
);
return %files{$name}
}

start {
for @files -> $file {
$dest.send( Slurp($file) );
}
$dest.close();
CATCH { diag 'read_worker failure:' ~ $_; $dest.fail($_) }
}
}

sub parse_worker($source, $dest) {
my grammar INIFile {
token TOP {
^
<entries>
<section>+
$
}

token section {
'[' ~ ']' <key> \n
<entries>
}

token entries {
[
| <entry> \n
| \n
]*
}

rule entry { <key> '=' <value> }

token key { \w+ }
token value { \N+ }

token ws { \h* }
}

my class INIFileActions {
method TOP($/) {
my %result;
%result<_> = $<entries>.ast;
for @<section> -> $sec {
%result{$sec<key>} = $sec<entries>.ast;
}
make %result;
}

method entries($/) {
my %entries;
for @<entry> -> $e {
%entries{$e<key>} = ~$e<value>;
}
make %entries;
}
my grammar INIFile {
token TOP {
^
<entries>
<section>+
$
}

token section {
'[' ~ ']' <key> \n
<entries>
}

token entries {
[
| <entry> \n
| \n
]*
}

rule entry { <key> '=' <value> }

token key { \w+ }
token value { \N+ }

token ws { \h* }
}

my class INIFileActions {
method TOP($/) {
my %result;
%result<_> = $<entries>.ast;
for @<section> -> $sec {
%result{$sec<key>} = $sec<entries>.ast;
}
make %result;
}

method entries($/) {
my %entries;
for @<entry> -> $e {
%entries{$e<key>} = ~$e<value>;
}
make %entries;
}
}

start {
react {
whenever $source {
if INIFile.parse($_, :actions(INIFileActions)) -> $parsed {
$dest.send($parsed.ast);
}
else {
$dest.fail("Could not parse INI file");
last;
}
}
}
$dest.close();
CATCH { diag 'parse worker failure:' ~ $_; $dest.fail($_) }
}
}

start {
loop {
earliest $source {
more $source {
if INIFile.parse($_, :actions(INIFileActions)) -> $parsed {
$dest.send($parsed.ast);
}
else {
$dest.fail("Could not parse INI file");
last;
}
}
done $source { last }
}
}
$dest.close();
CATCH { diag 'parse worker failure:' ~ $_; $dest.fail($_) }
}
}

sub config_combiner($source) {
my $p = Promise.new;
my $v = $p.vow;
start {
my %result;
loop {
earliest $source {
more $source {
for %^content.kv -> $sec, %kvs {
for %kvs.kv -> $k, $v {
%result{$sec}{$k} = $v;
}
}
}
done $source { last }
}
}
$v.keep(%result);
CATCH { diag "combiner failure:" ~ $_; $v.break($_) }
}
return $p;
my $p = Promise.new;
my $v = $p.vow;
start {
my %result;
react {
whenever $source {
for %^content.kv -> $sec, %kvs {
for %kvs.kv -> $k, $v {
%result{$sec}{$k} = $v;
}
}
}
}
$v.keep(%result);
CATCH { diag "combiner failure:" ~ $_; $v.break($_) }
}
return $p;
}
}

0 comments on commit 9828048

Please sign in to comment.