Updated MANIFEST.
[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 our %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 SqlfXML.";
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::SqlfXML;
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:field>
63       <sqlt:field>
64         <sqlt:name>title</sqlt:name>
65         <sqlt:data_type>varchar</sqlt:data_type>
66         <sqlt:default_value>hello</sqlt:default_value>
67         <sqlt:is_auto_increment>0</sqlt:is_auto_increment>
68         <sqlt:is_primary_key>0</sqlt:is_primary_key>
69         <sqlt:is_nullable>0</sqlt:is_nullable>
70         <sqlt:is_foreign_key>0</sqlt:is_foreign_key>
71         <sqlt:order>2</sqlt:order>
72         <sqlt:size>100</sqlt:size>
73       </sqlt:field>
74       <sqlt:field>
75         <sqlt:name>description</sqlt:name>
76         <sqlt:data_type>text</sqlt:data_type>
77         <sqlt:default_value></sqlt:default_value>
78         <sqlt:is_auto_increment>0</sqlt:is_auto_increment>
79         <sqlt:is_primary_key>0</sqlt:is_primary_key>
80         <sqlt:is_nullable>1</sqlt:is_nullable>
81         <sqlt:is_foreign_key>0</sqlt:is_foreign_key>
82         <sqlt:order>3</sqlt:order>
83         <sqlt:size>65000</sqlt:size>
84       </sqlt:field>
85       <sqlt:field>
86         <sqlt:name>email</sqlt:name>
87         <sqlt:data_type>varchar</sqlt:data_type>
88         <sqlt:is_auto_increment>0</sqlt:is_auto_increment>
89         <sqlt:is_primary_key>0</sqlt:is_primary_key>
90         <sqlt:is_nullable>1</sqlt:is_nullable>
91         <sqlt:is_foreign_key>0</sqlt:is_foreign_key>
92         <sqlt:order>4</sqlt:order>
93         <sqlt:size>255</sqlt:size>
94       </sqlt:field>
95     </sqlt:fields>
96     <sqlt:indices>
97       <sqlt:index>
98         <sqlt:fields>title</sqlt:fields>
99         <sqlt:name>titleindex</sqlt:name>
100         <sqlt:options></sqlt:options>
101         <sqlt:type>NORMAL</sqlt:type>
102       </sqlt:index>
103     </sqlt:indices>
104     <sqlt:constraints>
105       <sqlt:constraint>
106         <sqlt:deferrable>1</sqlt:deferrable>
107         <sqlt:expression></sqlt:expression>
108         <sqlt:fields>id</sqlt:fields>
109         <sqlt:match_type></sqlt:match_type>
110         <sqlt:name></sqlt:name>
111         <sqlt:options></sqlt:options>
112         <sqlt:on_delete></sqlt:on_delete>
113         <sqlt:on_update></sqlt:on_update>
114         <sqlt:reference_table></sqlt:reference_table>
115         <sqlt:type>PRIMARY KEY</sqlt:type>
116       </sqlt:constraint>
117       <sqlt:constraint>
118         <sqlt:deferrable>1</sqlt:deferrable>
119         <sqlt:expression></sqlt:expression>
120         <sqlt:fields>email</sqlt:fields>
121         <sqlt:match_type></sqlt:match_type>
122         <sqlt:name></sqlt:name>
123         <sqlt:options></sqlt:options>
124         <sqlt:on_delete></sqlt:on_delete>
125         <sqlt:on_update></sqlt:on_update>
126         <sqlt:reference_table></sqlt:reference_table>
127         <sqlt:type>UNIQUE</sqlt:type>
128       </sqlt:constraint>
129     </sqlt:constraints>
130   </sqlt:table>
131 </sqlt:schema>
132 EOXML
133
134 $obj = SQL::Translator->new(
135     debug          => DEBUG,
136     trace          => TRACE,
137     show_warnings  => 1,
138     add_drop_table => 1,
139     from           => "MySQL",
140     to             => "SqlfXML",
141 );
142 lives_ok { $xml = $obj->translate($file); }  "Translate ran";
143 ok("$xml" ne ""                             ,"Produced something!");
144 print "XML:\n$xml" if DEBUG;
145 # Strip sqlf header with its variable date so we diff safely
146 $xml =~ s/^([^\n]*\n){7}//m; 
147 eq_or_diff $xml, $ans                       ,"XML looks right";
148
149 #
150 # emit_empty_tags => 1
151 #
152
153 $ans = <<EOXML;
154 <sqlt:schema xmlns:sqlt="http://sqlfairy.sourceforge.net/sqlfairy.xml">
155   <sqlt:table>
156     <sqlt:name>Basic</sqlt:name>
157     <sqlt:order>2</sqlt:order>
158     <sqlt:fields>
159       <sqlt:field>
160         <sqlt:name>id</sqlt:name>
161         <sqlt:data_type>integer</sqlt:data_type>
162         <sqlt:default_value></sqlt:default_value>
163         <sqlt:is_auto_increment>1</sqlt:is_auto_increment>
164         <sqlt:is_primary_key>1</sqlt:is_primary_key>
165         <sqlt:is_nullable>0</sqlt:is_nullable>
166         <sqlt:is_foreign_key>0</sqlt:is_foreign_key>
167         <sqlt:order>5</sqlt:order>
168         <sqlt:size>10</sqlt:size>
169       </sqlt:field>
170       <sqlt:field>
171         <sqlt:name>title</sqlt:name>
172         <sqlt:data_type>varchar</sqlt:data_type>
173         <sqlt:default_value>hello</sqlt:default_value>
174         <sqlt:is_auto_increment>0</sqlt:is_auto_increment>
175         <sqlt:is_primary_key>0</sqlt:is_primary_key>
176         <sqlt:is_nullable>0</sqlt:is_nullable>
177         <sqlt:is_foreign_key>0</sqlt:is_foreign_key>
178         <sqlt:order>6</sqlt:order>
179         <sqlt:size>100</sqlt:size>
180       </sqlt:field>
181       <sqlt:field>
182         <sqlt:name>description</sqlt:name>
183         <sqlt:data_type>text</sqlt:data_type>
184         <sqlt:default_value></sqlt:default_value>
185         <sqlt:is_auto_increment>0</sqlt:is_auto_increment>
186         <sqlt:is_primary_key>0</sqlt:is_primary_key>
187         <sqlt:is_nullable>1</sqlt:is_nullable>
188         <sqlt:is_foreign_key>0</sqlt:is_foreign_key>
189         <sqlt:order>7</sqlt:order>
190         <sqlt:size>65000</sqlt:size>
191       </sqlt:field>
192       <sqlt:field>
193         <sqlt:name>email</sqlt:name>
194         <sqlt:data_type>varchar</sqlt:data_type>
195         <sqlt:default_value></sqlt:default_value>
196         <sqlt:is_auto_increment>0</sqlt:is_auto_increment>
197         <sqlt:is_primary_key>0</sqlt:is_primary_key>
198         <sqlt:is_nullable>1</sqlt:is_nullable>
199         <sqlt:is_foreign_key>0</sqlt:is_foreign_key>
200         <sqlt:order>8</sqlt:order>
201         <sqlt:size>255</sqlt:size>
202       </sqlt:field>
203     </sqlt:fields>
204     <sqlt:indices>
205       <sqlt:index>
206         <sqlt:fields>title</sqlt:fields>
207         <sqlt:name>titleindex</sqlt:name>
208         <sqlt:options></sqlt:options>
209         <sqlt:type>NORMAL</sqlt:type>
210       </sqlt:index>
211     </sqlt:indices>
212     <sqlt:constraints>
213       <sqlt:constraint>
214         <sqlt:deferrable>1</sqlt:deferrable>
215         <sqlt:expression></sqlt:expression>
216         <sqlt:fields>id</sqlt:fields>
217         <sqlt:match_type></sqlt:match_type>
218         <sqlt:name></sqlt:name>
219         <sqlt:options></sqlt:options>
220         <sqlt:on_delete></sqlt:on_delete>
221         <sqlt:on_update></sqlt:on_update>
222         <sqlt:reference_fields></sqlt:reference_fields>
223         <sqlt:reference_table></sqlt:reference_table>
224         <sqlt:type>PRIMARY KEY</sqlt:type>
225       </sqlt:constraint>
226       <sqlt:constraint>
227         <sqlt:deferrable>1</sqlt:deferrable>
228         <sqlt:expression></sqlt:expression>
229         <sqlt:fields>email</sqlt:fields>
230         <sqlt:match_type></sqlt:match_type>
231         <sqlt:name></sqlt:name>
232         <sqlt:options></sqlt:options>
233         <sqlt:on_delete></sqlt:on_delete>
234         <sqlt:on_update></sqlt:on_update>
235         <sqlt:reference_fields></sqlt:reference_fields>
236         <sqlt:reference_table></sqlt:reference_table>
237         <sqlt:type>UNIQUE</sqlt:type>
238       </sqlt:constraint>
239     </sqlt:constraints>
240   </sqlt:table>
241 </sqlt:schema>
242 EOXML
243
244 undef $obj;
245 $obj = SQL::Translator->new(
246     debug          => DEBUG,
247     trace          => TRACE,
248     show_warnings  => 1,
249     add_drop_table => 1,
250     from           => "MySQL",
251     to             => "SqlfXML",
252     producer_args  => { emit_empty_tags => 1 },
253 );
254 lives_ok { $xml = $obj->translate($file); }  "Translate ran";
255 ok("$xml" ne ""                             ,"Produced something!");
256 print "XML emit_empty_tags=>1:\n$xml" if DEBUG;
257 # Strip sqlf header with its variable date so we diff safely
258 $xml =~ s/^([^\n]*\n){7}//m; 
259 eq_or_diff $xml, $ans                       ,"XML looks right";
260     # This diff probably isn't a very good test! Should really check the
261     # result with XPath or something, but that would take ages to write ;-)
262
263 # TODO Make this a real test of attrib_values
264 # $obj = SQL::Translator->new(
265 #     debug          => DEBUG,
266 #     trace          => TRACE,
267 #     show_warnings  => 1,
268 #     add_drop_table => 1,
269 #     from           => "MySQL",
270 #     to             => "SqlfXML",
271 #     producer_args  => { attrib_values => 1 },
272 # );
273 # print $obj->translate($file);