#!/usr/bin/perl use strict; use warnings; use Best 0.05 [ [qw/YAML::Syck YAML/], qw/Dump LoadFile/ ]; #my @data = map { YAML::LoadFile($_) } @ARGV; # #my $combined = combine_tests(@data); # #print YAML::Dump($combined); print Dump(combine_tests(map { LoadFile($_) } @ARGV)); # # Annotates the last test tree with the earlier one's # and returns the modified reference. # Note: no copy is made! # # Adds a more_events[] with events to each event for which # there are variations among the tests. # A revision is added to each member of the more_events[]. # # more_revisions[] is added with revision number of the older versions. # sub combine_tests{ # # Collect all the test results indexed on filename/number # into %sum # my %sum; my @revisions; for my $data (@_) { my $revision = $data->{revision}; push @revisions, $revision; for my $file (@{ $data->{meat}{test_files} }) { my $fname = $file->{file}; for my $event (@{ $file->{events} }) { my $n = $event->{num}; push @{ $sum{$fname}[$n] }, {%$event, revision => $revision }; } } } # # Remove all events which are *identical* # my $all_the_same = sub { my $first = shift; for my $o ( @_ ) { for my $k ( keys %$o ) { next if $k eq 'revision'; return 0 unless defined $o->{$k}; return 0 unless $first->{$k} eq $o->{$k}; } } return 1; }; while( my ($fname, $events) = each %sum ) { for(my $i=1; $i<@$events; $i++) { my $event = $events->[$i]; if($all_the_same->(@{ $events->[$i] })) { undef $events->[$i]; } else { pop @{ $events->[$i] }; } } } # # Now, walk the target tree and add anomalies # to each event. # Note that I use the test number for reference, which will # blow up in our faces when tests are inserted. # It is better then checking for the names of the tests # since they are often the same for different tests. # my $target = $_[-1]; for my $file (@{ $target->{meat}{test_files} }) { my $fname = $file->{file}; for my $event (@{ $file->{events} }) { my $n = $event->{num}; if( defined $sum{$fname}[$n]){ $event->{more_events} = $sum{$fname}[$n]; } } } # # Add revisions which were added, not the target though # pop @revisions; $target->{more_revisions} = [ @revisions ] if @revisions; $target; }