Be stricter about no comments.
[dbsrgits/SQL-Translator.git] / t / 17sqlfxml-producer.t
CommitLineData
d0c12b9f 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
1ea530d4 7local $^W = 0;
8
d0c12b9f 9use strict;
10use Test::More;
11use Test::Exception;
12
13use Data::Dumper;
2e11379e 14my %opt;
d0c12b9f 15BEGIN { map { $opt{$_}=1 if s/^-// } @ARGV; }
16use constant DEBUG => (exists $opt{d} ? 1 : 0);
17use constant TRACE => (exists $opt{t} ? 1 : 0);
18
19use FindBin qw/$Bin/;
20
21my $file = "$Bin/data/mysql/sqlfxml-producer-basic.sql";
22
23
24# Testing 1,2,3,4...
25#=============================================================================
26
27eval { require XML::Writer; };
28if ($@ && $@ =~ m!locate XML::Writer.pm in!) {
ac62dff1 29 plan skip_all => "You need XML::Writer to use XML::SQLFairy.";
d0c12b9f 30}
31eval { require Test::Differences; };
32if ($@ && $@ =~ m!locate Test/Differences.pm in!) {
33 plan skip_all => "You need Test::Differences for this test.";
34}
35use Test::Differences;
36plan tests => 6;
37
38use SQL::Translator;
ac62dff1 39use SQL::Translator::Producer::XML::SQLFairy;
d0c12b9f 40
41my ($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>
11a08bd9 62 <sqlt:comments>comment on id field</sqlt:comments>
d0c12b9f 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>
11a08bd9 74 <sqlt:comments></sqlt:comments>
d0c12b9f 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>
ac62dff1 85 <sqlt:size>65535</sqlt:size>
11a08bd9 86 <sqlt:comments></sqlt:comments>
d0c12b9f 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>
11a08bd9 97 <sqlt:comments></sqlt:comments>
d0c12b9f 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>
136EOXML
137
138$obj = SQL::Translator->new(
139 debug => DEBUG,
140 trace => TRACE,
141 show_warnings => 1,
142 add_drop_table => 1,
ac62dff1 143 from => 'MySQL',
144 to => 'XML-SQLFairy',
d0c12b9f 145);
146lives_ok { $xml = $obj->translate($file); } "Translate ran";
147ok("$xml" ne "" ,"Produced something!");
148print "XML:\n$xml" if DEBUG;
149# Strip sqlf header with its variable date so we diff safely
150$xml =~ s/^([^\n]*\n){7}//m;
151eq_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>
11a08bd9 173 <sqlt:comments>comment on id field</sqlt:comments>
d0c12b9f 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>
11a08bd9 185 <sqlt:comments></sqlt:comments>
d0c12b9f 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>
ac62dff1 196 <sqlt:size>65535</sqlt:size>
11a08bd9 197 <sqlt:comments></sqlt:comments>
d0c12b9f 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>
11a08bd9 209 <sqlt:comments></sqlt:comments>
d0c12b9f 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>
250EOXML
251
252undef $obj;
253$obj = SQL::Translator->new(
254 debug => DEBUG,
255 trace => TRACE,
256 show_warnings => 1,
257 add_drop_table => 1,
ac62dff1 258 from => 'MySQL',
259 to => 'XML-SQLFairy',
d0c12b9f 260 producer_args => { emit_empty_tags => 1 },
261);
262lives_ok { $xml = $obj->translate($file); } "Translate ran";
263ok("$xml" ne "" ,"Produced something!");
264print "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;
267eq_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
a8e0cc1a 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",
2e11379e 278# to => "XML-SQLFairy",
a8e0cc1a 279# producer_args => { attrib_values => 1 },
280# );
281# print $obj->translate($file);