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