X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=t%2F60roundtrip.t;h=f0e000dde8e3810c37d0b5b2a3c6a744c272696b;hb=6440741a562ff8bb42c79282d30f3562c4336578;hp=6dbd0c351bdf50d9d11a5b886aef5aea3d55647c;hpb=0a2d7cf19e90384553da582487e138f63ec8241d;p=dbsrgits%2FSQL-Translator.git diff --git a/t/60roundtrip.t b/t/60roundtrip.t index 6dbd0c3..f0e000d 100644 --- a/t/60roundtrip.t +++ b/t/60roundtrip.t @@ -8,6 +8,8 @@ use Test::Differences; use FindBin qw/$Bin/; use SQL::Translator; +use SQL::Translator::Utils qw/ddl_parser_instance/; + ### Set $ENV{SQLTTEST_RT_DEBUG} = 1 for more output @@ -15,7 +17,14 @@ use SQL::Translator; my $plan = [ { engine => 'XML', + req => 'XML::LibXML 1.69', + no_grammar => 1, + }, + { + engine => 'YAML', + no_grammar => 1, }, + { engine => 'SQLite', producer_args => {}, @@ -48,11 +57,12 @@ my $plan = [ producer_args => {}, parser_args => {}, }, + { engine => 'Oracle', producer_args => {}, parser_args => {}, - todo => 'Needs volunteers', + todo_cmp => "auto-increment triggers aren't detected", }, { engine => 'Sybase', @@ -67,11 +77,6 @@ my $plan = [ todo => 'Needs volunteers', }, -# YAML parsing/producing cycles result in some weird self referencing structure -# { -# engine => 'YAML', -# }, - # There is no Access producer # { # engine => 'Access', @@ -83,17 +88,18 @@ my $plan = [ # This data file has the right mix of table/view/procedure/trigger # definitions, and lists enough quirks to trip up most combos -# I am not sure if augmenting it will break other tests - experiment -my $base_file = "$Bin/data/xml/schema.xml"; +my $base_file = "$Bin/data/roundtrip_autogen.yaml"; +open (my $base_fh, '<', $base_file) or die "$base_file: $!"; my $base_t = SQL::Translator->new; -$base_t->$_ (1) for qw/add_drop_table no_comments/; +$base_t->$_ (1) for qw/add_drop_table no_comments quote_identifiers/; my $base_schema = $base_t->translate ( - parser => 'XML', - file => $base_file, + parser => 'YAML', + data => do { local $/; <$base_fh>; }, ) or die $base_t->error; + #assume there is at least one table my $string_re = { XML => qr/\s*{todo} if $args->{todo}; - + SKIP: { $args->{name} ||= $args->{engine}; - lives_ok ( - sub { check_roundtrip ($args, $base_schema) }, - "Round trip for $args->{name} did not throw an exception", - ); + my @req = ref $args->{req} ? @{$args->{req}} : $args->{req}||(); + my @missing; + for (@req) { + eval "use $_ ()"; + push @missing, $_ if ($@); + } + if (@missing) { + skip sprintf ('Need %s for %s roundtrip test', + join (', ', @missing), + $args->{name}, + ); + } + + use_ok("SQL::Translator::Producer::$args->{engine}"); + use_ok("SQL::Translator::Parser::$args->{engine}"); + + ok(ddl_parser_instance($args->{engine}), 'Got proper parser instance') + unless $args->{no_grammar}; + + TODO: { + local $TODO = $args->{todo} if $args->{todo}; + + no warnings 'once'; + # silence PR::D from spewing on STDERR + local $::RD_ERRORS = 0 if $args->{todo}; + local $::RD_WARN = 0 if $args->{todo}; + local $::RD_HINT = 0 if $args->{todo}; + + lives_ok ( + sub { check_roundtrip ($args, $base_schema, $args->{todo_cmp}) }, + "Round trip for $args->{name} did not throw an exception", + ); + } } } sub check_roundtrip { - my ($args, $base_schema) = @_; + my ($args, $base_schema, $todo_cmp) = @_; my $base_t = $base_schema->translator; # create some output from the submitted schema @@ -137,7 +170,7 @@ sub check_roundtrip { # parse the sql back my $parser_t = SQL::Translator->new; - $parser_t->$_ (1) for qw/add_drop_table no_comments/; + $parser_t->$_ (1) for qw/add_drop_table no_comments quote_identifiers/; my $mid_schema = $parser_t->translate ( data => $base_out, parser => $args->{engine}, @@ -147,6 +180,12 @@ sub check_roundtrip { isa_ok ($mid_schema, 'SQL::Translator::Schema', "First $args->{name} parser pass produced a schema:") or do { diag (_gen_diag ( $parser_t->error, $base_out ) ); + my $i; + note join ("\n" . ( '=' x 76) . "\n", + 'Unparseable DDL:', + (join ("\n", map { ++$i . ":\t$_" } split /\n/, $base_out) ), + '' + ); return; }; @@ -155,7 +194,7 @@ sub check_roundtrip { _get_table_info ($mid_schema->get_tables), _get_table_info ($base_schema->get_tables), "Schema tables generally match afer $args->{name} parser trip", - ) or return; + ) or (diag(explain _get_table_info($mid_schema->get_tables)), return); # and produce sql once again @@ -185,11 +224,12 @@ sub check_roundtrip { return; }; + local $TODO = $todo_cmp; # the two sql strings should be identical my $msg = "$args->{name} SQL roundtrip successful - SQL statements match"; - $ENV{SQLTTEST_RT_DEBUG} #stringify below because IO::Scalar does not behave nice - ? eq_or_diff ("$rt_out", "$base_out", $msg) - : ok ("$rt_out" eq "$base_out", $msg) + $ENV{SQLTTEST_RT_DEBUG} + ? eq_or_diff ($rt_out, $base_out, $msg) + : ok ($rt_out eq $base_out, $msg) ; }