Added the new files
[dbsrgits/SQL-Translator.git] / t / 17sqlfxml-producer.t
1 #!/usr/bin/perl -w 
2 # vim:filetype=perl
3
4 # Before `make install' is performed this script should be runnable with
5 # `make test'. After `make install' it should work as `perl test.pl'
6
7 use strict;
8 use Test::More;
9 use Test::Exception;
10
11 use Data::Dumper;
12 our %opt;
13 BEGIN { map { $opt{$_}=1 if s/^-// } @ARGV; }
14 use constant DEBUG => (exists $opt{d} ? 1 : 0);
15 use constant TRACE => (exists $opt{t} ? 1 : 0);
16
17 use FindBin qw/$Bin/;
18
19 my $file = "$Bin/data/mysql/sqlfxml-producer-basic.sql";
20
21
22 # Testing 1,2,3,4...
23 #=============================================================================
24
25 eval { require XML::Writer; };
26 if ($@ && $@ =~ m!locate XML::Writer.pm in!) {
27     plan skip_all => "You need XML::Writer to use SqlfXML.";
28 }
29 eval { require Test::Differences; };
30 if ($@ && $@ =~ m!locate Test/Differences.pm in!) {
31     plan skip_all => "You need Test::Differences for this test.";
32 }
33 use Test::Differences;
34 plan tests => 6;
35     
36 use SQL::Translator;
37 use SQL::Translator::Producer::SqlfXML;
38
39 my ($obj,$ans,$xml);
40
41 #
42 # emit_empty_tags => 0
43 #
44
45 $ans = <<EOXML;
46 <sqlt:schema xmlns:sqlt="http://sqlfairy.sourceforge.net/sqlfairy.xml">
47   <sqlt:table>
48     <sqlt:name>Basic</sqlt:name>
49     <sqlt:order>1</sqlt:order>
50     <sqlt:fields>
51       <sqlt:field>
52         <sqlt:name>id</sqlt:name>
53         <sqlt:data_type>integer</sqlt:data_type>
54         <sqlt:is_auto_increment>1</sqlt:is_auto_increment>
55         <sqlt:is_primary_key>1</sqlt:is_primary_key>
56         <sqlt:is_nullable>0</sqlt:is_nullable>
57         <sqlt:is_foreign_key>0</sqlt:is_foreign_key>
58         <sqlt:order>1</sqlt:order>
59         <sqlt:size>10</sqlt:size>
60       </sqlt:field>
61       <sqlt:field>
62         <sqlt:name>title</sqlt:name>
63         <sqlt:data_type>varchar</sqlt:data_type>
64         <sqlt:default_value>hello</sqlt:default_value>
65         <sqlt:is_auto_increment>0</sqlt:is_auto_increment>
66         <sqlt:is_primary_key>0</sqlt:is_primary_key>
67         <sqlt:is_nullable>0</sqlt:is_nullable>
68         <sqlt:is_foreign_key>0</sqlt:is_foreign_key>
69         <sqlt:order>2</sqlt:order>
70         <sqlt:size>100</sqlt:size>
71       </sqlt:field>
72       <sqlt:field>
73         <sqlt:name>description</sqlt:name>
74         <sqlt:data_type>text</sqlt:data_type>
75         <sqlt:default_value></sqlt:default_value>
76         <sqlt:is_auto_increment>0</sqlt:is_auto_increment>
77         <sqlt:is_primary_key>0</sqlt:is_primary_key>
78         <sqlt:is_nullable>1</sqlt:is_nullable>
79         <sqlt:is_foreign_key>0</sqlt:is_foreign_key>
80         <sqlt:order>3</sqlt:order>
81         <sqlt:size>0</sqlt:size>
82       </sqlt:field>
83       <sqlt:field>
84         <sqlt:name>email</sqlt:name>
85         <sqlt:data_type>varchar</sqlt:data_type>
86         <sqlt:is_auto_increment>0</sqlt:is_auto_increment>
87         <sqlt:is_primary_key>0</sqlt:is_primary_key>
88         <sqlt:is_nullable>1</sqlt:is_nullable>
89         <sqlt:is_foreign_key>0</sqlt:is_foreign_key>
90         <sqlt:order>4</sqlt:order>
91         <sqlt:size>255</sqlt:size>
92       </sqlt:field>
93     </sqlt:fields>
94     <sqlt:indices>
95       <sqlt:index>
96         <sqlt:fields>title</sqlt:fields>
97         <sqlt:name>titleindex</sqlt:name>
98         <sqlt:options></sqlt:options>
99         <sqlt:type>NORMAL</sqlt:type>
100       </sqlt:index>
101     </sqlt:indices>
102     <sqlt:constraints>
103       <sqlt:constraint>
104         <sqlt:deferrable>1</sqlt:deferrable>
105         <sqlt:expression></sqlt:expression>
106         <sqlt:fields>id</sqlt:fields>
107         <sqlt:match_type></sqlt:match_type>
108         <sqlt:name></sqlt:name>
109         <sqlt:options></sqlt:options>
110         <sqlt:on_delete></sqlt:on_delete>
111         <sqlt:on_update></sqlt:on_update>
112         <sqlt:reference_table></sqlt:reference_table>
113         <sqlt:type>PRIMARY KEY</sqlt:type>
114       </sqlt:constraint>
115       <sqlt:constraint>
116         <sqlt:deferrable>1</sqlt:deferrable>
117         <sqlt:expression></sqlt:expression>
118         <sqlt:fields>email</sqlt:fields>
119         <sqlt:match_type></sqlt:match_type>
120         <sqlt:name></sqlt:name>
121         <sqlt:options></sqlt:options>
122         <sqlt:on_delete></sqlt:on_delete>
123         <sqlt:on_update></sqlt:on_update>
124         <sqlt:reference_table></sqlt:reference_table>
125         <sqlt:type>UNIQUE</sqlt:type>
126       </sqlt:constraint>
127     </sqlt:constraints>
128   </sqlt:table>
129 </sqlt:schema>
130 EOXML
131
132 $obj = SQL::Translator->new(
133     debug          => DEBUG,
134     trace          => TRACE,
135     show_warnings  => 1,
136     add_drop_table => 1,
137     from           => "MySQL",
138     to             => "SqlfXML",
139 );
140 lives_ok { $xml = $obj->translate($file); }  "Translate ran";
141 ok("$xml" ne ""                             ,"Produced something!");
142 print "XML:\n$xml" if DEBUG;
143 # Strip sqlf header with its variable date so we diff safely
144 $xml =~ s/^([^\n]*\n){7}//m; 
145 eq_or_diff $xml, $ans                       ,"XML looks right";
146
147 #
148 # emit_empty_tags => 1
149 #
150
151 $ans = <<EOXML;
152 <sqlt:schema xmlns:sqlt="http://sqlfairy.sourceforge.net/sqlfairy.xml">
153   <sqlt:table>
154     <sqlt:name>Basic</sqlt:name>
155     <sqlt:order>2</sqlt:order>
156     <sqlt:fields>
157       <sqlt:field>
158         <sqlt:name>id</sqlt:name>
159         <sqlt:data_type>integer</sqlt:data_type>
160         <sqlt:default_value></sqlt:default_value>
161         <sqlt:is_auto_increment>1</sqlt:is_auto_increment>
162         <sqlt:is_primary_key>1</sqlt:is_primary_key>
163         <sqlt:is_nullable>0</sqlt:is_nullable>
164         <sqlt:is_foreign_key>0</sqlt:is_foreign_key>
165         <sqlt:order>5</sqlt:order>
166         <sqlt:size>10</sqlt:size>
167       </sqlt:field>
168       <sqlt:field>
169         <sqlt:name>title</sqlt:name>
170         <sqlt:data_type>varchar</sqlt:data_type>
171         <sqlt:default_value>hello</sqlt:default_value>
172         <sqlt:is_auto_increment>0</sqlt:is_auto_increment>
173         <sqlt:is_primary_key>0</sqlt:is_primary_key>
174         <sqlt:is_nullable>0</sqlt:is_nullable>
175         <sqlt:is_foreign_key>0</sqlt:is_foreign_key>
176         <sqlt:order>6</sqlt:order>
177         <sqlt:size>100</sqlt:size>
178       </sqlt:field>
179       <sqlt:field>
180         <sqlt:name>description</sqlt:name>
181         <sqlt:data_type>text</sqlt:data_type>
182         <sqlt:default_value></sqlt:default_value>
183         <sqlt:is_auto_increment>0</sqlt:is_auto_increment>
184         <sqlt:is_primary_key>0</sqlt:is_primary_key>
185         <sqlt:is_nullable>1</sqlt:is_nullable>
186         <sqlt:is_foreign_key>0</sqlt:is_foreign_key>
187         <sqlt:order>7</sqlt:order>
188         <sqlt:size>0</sqlt:size>
189       </sqlt:field>
190       <sqlt:field>
191         <sqlt:name>email</sqlt:name>
192         <sqlt:data_type>varchar</sqlt:data_type>
193         <sqlt:default_value></sqlt:default_value>
194         <sqlt:is_auto_increment>0</sqlt:is_auto_increment>
195         <sqlt:is_primary_key>0</sqlt:is_primary_key>
196         <sqlt:is_nullable>1</sqlt:is_nullable>
197         <sqlt:is_foreign_key>0</sqlt:is_foreign_key>
198         <sqlt:order>8</sqlt:order>
199         <sqlt:size>255</sqlt:size>
200       </sqlt:field>
201     </sqlt:fields>
202     <sqlt:indices>
203       <sqlt:index>
204         <sqlt:fields>title</sqlt:fields>
205         <sqlt:name>titleindex</sqlt:name>
206         <sqlt:options></sqlt:options>
207         <sqlt:type>NORMAL</sqlt:type>
208       </sqlt:index>
209     </sqlt:indices>
210     <sqlt:constraints>
211       <sqlt:constraint>
212         <sqlt:deferrable>1</sqlt:deferrable>
213         <sqlt:expression></sqlt:expression>
214         <sqlt:fields>id</sqlt:fields>
215         <sqlt:match_type></sqlt:match_type>
216         <sqlt:name></sqlt:name>
217         <sqlt:options></sqlt:options>
218         <sqlt:on_delete></sqlt:on_delete>
219         <sqlt:on_update></sqlt:on_update>
220         <sqlt:reference_fields></sqlt:reference_fields>
221         <sqlt:reference_table></sqlt:reference_table>
222         <sqlt:type>PRIMARY KEY</sqlt:type>
223       </sqlt:constraint>
224       <sqlt:constraint>
225         <sqlt:deferrable>1</sqlt:deferrable>
226         <sqlt:expression></sqlt:expression>
227         <sqlt:fields>email</sqlt:fields>
228         <sqlt:match_type></sqlt:match_type>
229         <sqlt:name></sqlt:name>
230         <sqlt:options></sqlt:options>
231         <sqlt:on_delete></sqlt:on_delete>
232         <sqlt:on_update></sqlt:on_update>
233         <sqlt:reference_fields></sqlt:reference_fields>
234         <sqlt:reference_table></sqlt:reference_table>
235         <sqlt:type>UNIQUE</sqlt:type>
236       </sqlt:constraint>
237     </sqlt:constraints>
238   </sqlt:table>
239 </sqlt:schema>
240 EOXML
241
242 undef $obj;
243 $obj = SQL::Translator->new(
244     debug          => DEBUG,
245     trace          => TRACE,
246     show_warnings  => 1,
247     add_drop_table => 1,
248     from           => "MySQL",
249     to             => "SqlfXML",
250     producer_args  => { emit_empty_tags => 1 },
251 );
252 lives_ok { $xml = $obj->translate($file); }  "Translate ran";
253 ok("$xml" ne ""                             ,"Produced something!");
254 print "XML emit_empty_tags=>1:\n$xml" if DEBUG;
255 # Strip sqlf header with its variable date so we diff safely
256 $xml =~ s/^([^\n]*\n){7}//m; 
257 eq_or_diff $xml, $ans                       ,"XML looks right";
258     # This diff probably isn't a very good test! Should really check the
259     # result with XPath or something, but that would take ages to write ;-)
260
261 # TODO Make this a real test of attrib_values
262 # $obj = SQL::Translator->new(
263 #     debug          => DEBUG,
264 #     trace          => TRACE,
265 #     show_warnings  => 1,
266 #     add_drop_table => 1,
267 #     from           => "MySQL",
268 #     to             => "SqlfXML",
269 #     producer_args  => { attrib_values => 1 },
270 # );
271 # print $obj->translate($file);