xamplr 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (142) hide show
  1. data/CHANGES.txt +13 -0
  2. data/LICENSE +3 -0
  3. data/README.rdoc +26 -0
  4. data/README.rdoc.orig +118 -0
  5. data/Rakefile +85 -0
  6. data/VERSION.yml +4 -0
  7. data/examples/random-people-shared-addresses/Makefile +16 -0
  8. data/examples/random-people-shared-addresses/batch-load-users.rb +83 -0
  9. data/examples/random-people-shared-addresses/find-mentions.rb +47 -0
  10. data/examples/random-people-shared-addresses/find-people-by-address.rb +104 -0
  11. data/examples/random-people-shared-addresses/optimise.rb +16 -0
  12. data/examples/random-people-shared-addresses/people.rb +35 -0
  13. data/examples/random-people-shared-addresses/query.rb +75 -0
  14. data/examples/random-people-shared-addresses/query2.rb +73 -0
  15. data/examples/random-people-shared-addresses/random-names.csv +10000 -0
  16. data/examples/random-people-shared-addresses/settings.rb +3 -0
  17. data/examples/random-people-shared-addresses/what-to-query-on.rb +82 -0
  18. data/examples/random-people-shared-addresses/xampl-gen.rb +36 -0
  19. data/examples/random-people-shared-addresses/xml/people.xml +14 -0
  20. data/examples/random-people/Makefile +16 -0
  21. data/examples/random-people/batch-load-users.rb +61 -0
  22. data/examples/random-people/optimise.rb +16 -0
  23. data/examples/random-people/people.rb +22 -0
  24. data/examples/random-people/query.rb +73 -0
  25. data/examples/random-people/query2.rb +73 -0
  26. data/examples/random-people/random-names.csv +10000 -0
  27. data/examples/random-people/rawtc.rb +91 -0
  28. data/examples/random-people/settings.rb +3 -0
  29. data/examples/random-people/what-to-query-on.rb +80 -0
  30. data/examples/random-people/xampl-gen.rb +36 -0
  31. data/examples/random-people/xml/people.xml +11 -0
  32. data/examples/read-testing/Makefile +10 -0
  33. data/examples/read-testing/load.rb +65 -0
  34. data/examples/read-testing/read.rb +51 -0
  35. data/examples/read-testing/rrr.rb +87 -0
  36. data/examples/read-testing/settings.rb +2 -0
  37. data/examples/read-testing/xampl-gen.rb +36 -0
  38. data/examples/read-testing/xml/text.xml +8 -0
  39. data/examples/tokyo-cabinet-experimental/expt-query.rb +42 -0
  40. data/examples/tokyo-cabinet-experimental/expt-query2.rb +42 -0
  41. data/examples/tokyo-cabinet-experimental/expt-query3.rb +41 -0
  42. data/examples/tokyo-cabinet-experimental/expt-reader.rb +32 -0
  43. data/examples/tokyo-cabinet-experimental/expt.rb +61 -0
  44. data/examples/tokyo-cabinet-experimental/xampl-gen.rb +36 -0
  45. data/examples/tokyo-cabinet-experimental/xml/tcx.xml +6 -0
  46. data/lib/xampl-generator.rb +3 -0
  47. data/lib/xampl.rb +3 -0
  48. data/lib/xamplr-generator.rb +10 -0
  49. data/lib/xamplr.rb +37 -0
  50. data/lib/xamplr/README-POSSIBLE-PROBLEMS +5 -0
  51. data/lib/xamplr/TODO +1 -0
  52. data/lib/xamplr/exceptions.rb +97 -0
  53. data/lib/xamplr/from-xml-orig.rb +350 -0
  54. data/lib/xamplr/from-xml.rb +439 -0
  55. data/lib/xamplr/gen-elements.xml +6230 -0
  56. data/lib/xamplr/gen.elements.xml +108 -0
  57. data/lib/xamplr/generate-elements.rb +15 -0
  58. data/lib/xamplr/generator.rb +5 -0
  59. data/lib/xamplr/graphml-out.rb +470 -0
  60. data/lib/xamplr/handwritten/example.rb +698 -0
  61. data/lib/xamplr/handwritten/hand-example.rb +533 -0
  62. data/lib/xamplr/handwritten/test-handwritten.rb +873 -0
  63. data/lib/xamplr/indexed-array.rb +115 -0
  64. data/lib/xamplr/mixins.rb +397 -0
  65. data/lib/xamplr/my.gen.elements.xml +461 -0
  66. data/lib/xamplr/notifications.rb +57 -0
  67. data/lib/xamplr/obsolete/fsdb.rb +62 -0
  68. data/lib/xamplr/persist-to-xml.rb +249 -0
  69. data/lib/xamplr/persistence.rb +522 -0
  70. data/lib/xamplr/persistence.rb.more_thread_safe +771 -0
  71. data/lib/xamplr/persistence.rb.partially_thread_safe +763 -0
  72. data/lib/xamplr/persister.rb +310 -0
  73. data/lib/xamplr/persisters/caches.rb +186 -0
  74. data/lib/xamplr/persisters/caching.rb +172 -0
  75. data/lib/xamplr/persisters/filesystem.rb +60 -0
  76. data/lib/xamplr/persisters/in-memory.rb +180 -0
  77. data/lib/xamplr/persisters/simple.rb +59 -0
  78. data/lib/xamplr/persisters/tokyo-cabinet.rb +641 -0
  79. data/lib/xamplr/simpleTemplate/danger.rx +4 -0
  80. data/lib/xamplr/simpleTemplate/obsolete/input-c.r4 +35 -0
  81. data/lib/xamplr/simpleTemplate/obsolete/play.r6.txt +12 -0
  82. data/lib/xamplr/simpleTemplate/obsolete/play_more.r6.txt +20 -0
  83. data/lib/xamplr/simpleTemplate/obsolete/test001.r5 +8 -0
  84. data/lib/xamplr/simpleTemplate/obsolete/test002.r5 +13 -0
  85. data/lib/xamplr/simpleTemplate/obsolete/test003.r5 +37 -0
  86. data/lib/xamplr/simpleTemplate/old/r6.000.rb +122 -0
  87. data/lib/xamplr/simpleTemplate/old/r6.001.rb +145 -0
  88. data/lib/xamplr/simpleTemplate/play.r6 +12 -0
  89. data/lib/xamplr/simpleTemplate/play_more.r6 +20 -0
  90. data/lib/xamplr/simpleTemplate/play_noblanks.r6 +21 -0
  91. data/lib/xamplr/simpleTemplate/playq.r6 +16 -0
  92. data/lib/xamplr/simpleTemplate/r6.rb +87 -0
  93. data/lib/xamplr/simpleTemplate/simple-template.rb +75 -0
  94. data/lib/xamplr/templates/child.template +47 -0
  95. data/lib/xamplr/templates/child_indexed.template +89 -0
  96. data/lib/xamplr/templates/child_modules.template +5 -0
  97. data/lib/xamplr/templates/element_classes.template +11 -0
  98. data/lib/xamplr/templates/element_data.template +282 -0
  99. data/lib/xamplr/templates/element_empty.template +285 -0
  100. data/lib/xamplr/templates/element_mixed.template +277 -0
  101. data/lib/xamplr/templates/element_simple.template +276 -0
  102. data/lib/xamplr/templates/package.template +26 -0
  103. data/lib/xamplr/test-support/Makefile +47 -0
  104. data/lib/xamplr/test-support/bench-cache.rb +80 -0
  105. data/lib/xamplr/test-support/bench-script.rb +21 -0
  106. data/lib/xamplr/test-support/bench.rb +116 -0
  107. data/lib/xamplr/test-support/bench2.rb +132 -0
  108. data/lib/xamplr/test-support/test-cache.rb +147 -0
  109. data/lib/xamplr/test-support/test-data/binding.xml +7 -0
  110. data/lib/xamplr/test-support/test-data/example.xml +14 -0
  111. data/lib/xamplr/test-support/test-data/internationalization-utf8.txt +1 -0
  112. data/lib/xamplr/test-support/test-data/labels.xml +37 -0
  113. data/lib/xamplr/test-support/test-data/labels001.xml +38 -0
  114. data/lib/xamplr/test-support/test-deep-change.rb +135 -0
  115. data/lib/xamplr/test-support/test-elements.rb +109 -0
  116. data/lib/xamplr/test-support/test-indexed-array.rb +169 -0
  117. data/lib/xamplr/test-support/test-misc.rb +73 -0
  118. data/lib/xamplr/test-support/test-names.rb +67 -0
  119. data/lib/xamplr/test-support/test-rollback.rb +106 -0
  120. data/lib/xamplr/test-support/test.rb +1504 -0
  121. data/lib/xamplr/to-ruby.rb +220 -0
  122. data/lib/xamplr/to-xml.rb +158 -0
  123. data/lib/xamplr/version.rb +67 -0
  124. data/lib/xamplr/visitor.rb +140 -0
  125. data/lib/xamplr/visitors.rb +573 -0
  126. data/lib/xamplr/xampl-generator.rb +533 -0
  127. data/lib/xamplr/xampl-hand-generated.rb +1535 -0
  128. data/lib/xamplr/xampl-module.rb +36 -0
  129. data/lib/xamplr/xampl-object-internals.rb +6 -0
  130. data/lib/xamplr/xampl-object.rb +202 -0
  131. data/lib/xamplr/xampl-persisted-object.rb +122 -0
  132. data/lib/xamplr/xml-text.rb +117 -0
  133. data/lib/xamplr/xml/document.xml +7 -0
  134. data/lib/xamplr/xml/elements.xml +101 -0
  135. data/lib/xamplr/xml/elements000.xml +73 -0
  136. data/lib/xamplr/xml/example.xml +23 -0
  137. data/lib/xamplr/xml/options.xml +12 -0
  138. data/lib/xamplr/xml/uche.xml +38 -0
  139. data/lib/xamplr/yEd-sample.graphml +300 -0
  140. data/test/test_helper.rb +10 -0
  141. data/test/xamplr_test.rb +7 -0
  142. metadata +245 -0
@@ -0,0 +1,873 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "test/unit"
4
+
5
+ require "xamplr-generator"
6
+ require "example"
7
+
8
+ include XamplGenerator
9
+ include Xampl
10
+ include XamplExample
11
+
12
+ class TestXampl < Test::Unit::TestCase
13
+
14
+ def test_simple_xampl
15
+ emph1 = Emph.new
16
+ assert_not_nil(emph1.is_changed)
17
+ emph2 = Emph.new
18
+ assert_not_nil(emph2.is_changed)
19
+ emph3 = Emph.new
20
+ assert_not_nil(emph3.is_changed)
21
+
22
+ emph1.content = "emph 1"
23
+ assert_not_nil(emph1.is_changed)
24
+ emph2.content = "emph 2"
25
+ assert_not_nil(emph2.is_changed)
26
+
27
+ assert_equal("emph 1", emph1.content)
28
+ assert_equal("emph 2", emph2.content)
29
+
30
+ assert_equal("<ns0:emph xmlns:ns0='http://xampl.com/example'>emph 1</ns0:emph>", emph1.to_xml)
31
+ assert_equal("<ns0:emph xmlns:ns0='http://xampl.com/example'>emph 2</ns0:emph>", emph2.to_xml)
32
+ assert_equal("<ns0:emph xmlns:ns0='http://xampl.com/example'/>", emph3.to_xml)
33
+
34
+ fakeRules = XMLPrinter.new("fake...")
35
+ emph1.to_xml_internal(fakeRules)
36
+ r = fakeRules.done
37
+
38
+ assert_equal("fake... xmlns:ns0='http://xampl.com/example'<ns0:emph>emph 1</ns0:emph>", r)
39
+
40
+ assert_not_nil(emph1.is_changed)
41
+ assert_not_nil(emph2.is_changed)
42
+ assert_not_nil(emph3.is_changed)
43
+
44
+ check_parents(emph1)
45
+ check_parents(emph2)
46
+ check_parents(emph3)
47
+ end
48
+
49
+ def test_empty_xampl
50
+ stuff1 = Stuff.new
51
+ assert_not_nil(stuff1.is_changed)
52
+ stuff1.kind = 'test'
53
+ assert_not_nil(stuff1.is_changed)
54
+
55
+ stuff2 = Stuff.new
56
+ assert_not_nil(stuff2.is_changed)
57
+
58
+ stuff3 = Stuff.new
59
+ assert_not_nil(stuff3.is_changed)
60
+ stuff3.kind = 'test'
61
+ assert_not_nil(stuff3.is_changed)
62
+ stuff3.special = 'test'
63
+ assert_not_nil(stuff3.is_changed)
64
+
65
+ assert_equal("<ns1:stuff kind='test' xmlns:ns1='http://xampl.com/example' xmlns:ns0='http://xampl.com/example/special'/>",
66
+ stuff1.to_xml)
67
+ assert_equal("<ns1:stuff xmlns:ns1='http://xampl.com/example' xmlns:ns0='http://xampl.com/example/special'/>",
68
+ stuff2.to_xml)
69
+ assert_equal("<ns1:stuff kind='test' ns0:special='test' xmlns:ns1='http://xampl.com/example' xmlns:ns0='http://xampl.com/example/special'/>",
70
+ stuff3.to_xml)
71
+
72
+ fakeRules = XMLPrinter.new("fake...")
73
+ stuff1.to_xml_internal(fakeRules)
74
+ r = fakeRules.done
75
+ assert_equal("fake... xmlns:ns1='http://xampl.com/example' xmlns:ns0='http://xampl.com/example/special'<ns1:stuff kind='test'/>", r)
76
+
77
+ check_parents(stuff1)
78
+ check_parents(stuff2)
79
+ check_parents(stuff3)
80
+ end
81
+
82
+ def test_mixed_xampl
83
+ desc1 = Description.new
84
+ assert_not_nil(desc1.is_changed)
85
+ desc1.kind = "desc1"
86
+ assert_not_nil(desc1.is_changed)
87
+ assert_equal("<ns0:description kind='desc1' xmlns:ns0='http://xampl.com/example'/>",
88
+ desc1.to_xml)
89
+
90
+ desc1.add_content("hello ")
91
+ emph_content_1 = "there"
92
+ desc1.new_emph.content = emph_content_1
93
+ desc1.add_content("! How ")
94
+ emph_content_2 = "are"
95
+ desc1.new_emph.content = emph_content_2
96
+ desc1.add_content(" you?")
97
+
98
+ assert_not_nil(desc1.is_changed)
99
+ assert_equal("<ns0:description kind='desc1' xmlns:ns0='http://xampl.com/example'>hello <ns0:emph>there</ns0:emph>! How <ns0:emph>are</ns0:emph> you?</ns0:description>",
100
+ desc1.to_xml)
101
+ assert_equal(desc1.emph_child.length, 2)
102
+ assert_equal(emph_content_1, desc1.emph_child[0].content, emph_content_1)
103
+ assert_equal(emph_content_2, desc1.emph_child[1].content, emph_content_2)
104
+
105
+ check_parents(desc1)
106
+ end
107
+
108
+ def test_data_xampl
109
+ emph_content_1 = "there"
110
+ emph_content_2 = "are"
111
+ big_thing = Xampl.make(Thing){ | big_thing |
112
+ big_thing.new_thing("thing"){ | thing |
113
+ thing.new_stuff.kind = "stuff1"
114
+
115
+ thing.new_description{ | desc |
116
+ desc.kind = "desc1"
117
+
118
+ desc.add_content("hello ")
119
+ desc.new_emph.content = emph_content_1
120
+ desc.add_content("! How ")
121
+ desc.new_emph.content = emph_content_2
122
+ desc.add_content(" you?")
123
+ }
124
+ }
125
+ }
126
+
127
+ ### desc1 = Description.new
128
+ ### desc1.kind = "desc1"
129
+ ###
130
+ ### desc1.add_content("hello ")
131
+ ### emph_content_1 = "there"
132
+ ### desc1.new_emph.content = emph_content_1
133
+ ### desc1.add_content("! How ")
134
+ ### emph_content_2 = "are"
135
+ ### desc1.new_emph.content = emph_content_2
136
+ ### desc1.add_content(" you?")
137
+ ###
138
+ ### thing = Thing.new
139
+ ### thing.pid = "thing"
140
+ ### assert(thing.is_changed)
141
+ ### thing.new_stuff.kind = "stuff1"
142
+ ### assert_not_nil(thing.is_changed)
143
+ ### thing.is_changed = nil
144
+ ### thing.add_description(desc1)
145
+ ### assert_not_nil(thing.is_changed)
146
+ ###
147
+ ### big_thing = Thing.new
148
+ ### big_thing.add_thing(thing)
149
+ assert_equal("<ns0:thing xmlns:ns0='http://xampl.com/example' xmlns:ns1='http://xampl.com/example/special'><ns0:thing pid='thing'><ns0:stuff kind='stuff1'/><ns0:description kind='desc1'>hello <ns0:emph>there</ns0:emph>! How <ns0:emph>are</ns0:emph> you?</ns0:description></ns0:thing></ns0:thing>",
150
+ big_thing.to_xml)
151
+
152
+ assert_equal(1, big_thing.children.length)
153
+ assert_equal(2, big_thing.thing_child[0].children.length)
154
+ assert_equal(big_thing.thing_child[0].description_child[0].emph_child.length, 2)
155
+ assert_equal(emph_content_1, big_thing.thing_child[0].description_child[0].emph_child[0].content, emph_content_1)
156
+ assert_equal(emph_content_2, big_thing.thing_child[0].description_child[0].emph_child[1].content, emph_content_2)
157
+
158
+ check_parents(big_thing)
159
+ end
160
+
161
+ def test_data_xampl_using_append
162
+ emph_content_1 = "there"
163
+ emph1 = Emph.new
164
+ emph1 << emph_content_1
165
+
166
+ emph_content_2 = "are"
167
+ emph2 = Emph.new
168
+ emph2.content = emph_content_2
169
+
170
+ desc1 = Description.new
171
+ desc1.kind = "desc1"
172
+
173
+ desc1.is_changed = nil
174
+ desc1 << "hello " << emph1 << "! How " << emph2 << " you?"
175
+ assert_not_nil(desc1.is_changed)
176
+
177
+ thing = Thing.new
178
+ thing.pid = "thing"
179
+ thing.new_stuff.kind = "stuff1"
180
+ thing << desc1
181
+
182
+ big_thing = Thing.new
183
+ big_thing << thing
184
+
185
+ assert_equal("<ns0:thing xmlns:ns0='http://xampl.com/example' xmlns:ns1='http://xampl.com/example/special'><ns0:thing pid='thing'><ns0:stuff kind='stuff1'/><ns0:description kind='desc1'>hello <ns0:emph>there</ns0:emph>! How <ns0:emph>are</ns0:emph> you?</ns0:description></ns0:thing></ns0:thing>",
186
+ big_thing.to_xml)
187
+
188
+ assert_equal(2, big_thing.thing_child[0].description_child[0].emph_child.length)
189
+ assert_equal(emph_content_1, big_thing.thing_child[0].description_child[0].emph_child[0].content)
190
+ assert_equal(emph_content_2, big_thing.thing_child[0].description_child[0].emph_child[1].content)
191
+
192
+ check_parents(big_thing)
193
+ end
194
+
195
+ def test_from_xml
196
+ emph_content_1 = "there"
197
+ emph1 = Emph.new
198
+ emph1 << emph_content_1
199
+
200
+ emph_content_2 = "are"
201
+ emph2 = Emph.new
202
+ emph2.content = emph_content_2
203
+
204
+ desc1 = Description.new
205
+ desc1.kind = "desc1"
206
+
207
+ desc1.is_changed = nil
208
+ desc1 << "hello " << emph1 << "! How " << emph2 << " you?"
209
+
210
+ thing = Thing.new
211
+ thing.pid = "thing"
212
+ thing.new_stuff.kind = "stuff1"
213
+ thing << desc1
214
+
215
+ big_thing = Thing.new
216
+ big_thing << "leading content" << thing << "trailing content"
217
+
218
+ #puts big_thing.to_xml
219
+ #pp = FromXML.new
220
+ #pp.setup_parse_string(big_thing.to_xml)
221
+ #while not pp.endDocument?
222
+ #event = pp.next_interesting_event
223
+ #puts event
224
+ #if (event == Xampl_PP::TEXT) then
225
+ #puts "TEXT [[[" << pp.text << "]]]"
226
+ #end
227
+ #end
228
+
229
+ pp = FromXML.new
230
+ pp.setup_parse_string(big_thing.to_xml)
231
+ assert_equal(pp.next_interesting_event, Xampl_PP::START_ELEMENT)
232
+ assert_equal(pp.next_interesting_event, Xampl_PP::TEXT)
233
+ assert_equal(pp.next_interesting_event, Xampl_PP::START_ELEMENT)
234
+ assert_equal(pp.next_interesting_event, Xampl_PP::START_ELEMENT)
235
+
236
+ assert_equal(pp.next_interesting_event, Xampl_PP::END_ELEMENT)
237
+ assert_equal(pp.next_interesting_event, Xampl_PP::START_ELEMENT)
238
+ assert_equal(pp.next_interesting_event, Xampl_PP::TEXT)
239
+ assert_equal(pp.next_interesting_event, Xampl_PP::START_ELEMENT)
240
+ assert_equal(pp.next_interesting_event, Xampl_PP::TEXT)
241
+ assert_equal(pp.next_interesting_event, Xampl_PP::END_ELEMENT)
242
+ assert_equal(pp.next_interesting_event, Xampl_PP::TEXT)
243
+ assert_equal(pp.next_interesting_event, Xampl_PP::START_ELEMENT)
244
+ assert_equal(pp.next_interesting_event, Xampl_PP::TEXT)
245
+ assert_equal(pp.next_interesting_event, Xampl_PP::END_ELEMENT)
246
+ assert_equal(pp.next_interesting_event, Xampl_PP::TEXT)
247
+ assert_equal(pp.next_interesting_event, Xampl_PP::END_ELEMENT)
248
+ assert_equal(pp.next_interesting_event, Xampl_PP::END_ELEMENT)
249
+ assert_equal(pp.next_interesting_event, Xampl_PP::END_ELEMENT)
250
+ assert_equal(pp.next_interesting_event, Xampl_PP::END_DOCUMENT)
251
+ assert(pp.endDocument?)
252
+
253
+ pp = FromXML.new
254
+ another_big_thing = pp.parse_string(big_thing.to_xml)
255
+ assert_equal(big_thing.to_xml, another_big_thing.to_xml)
256
+ end
257
+
258
+ def test_index
259
+ thing = Thing.new
260
+ thing.new_key_value("one").value = "1"
261
+ thing.new_key_value("two").value = "2"
262
+
263
+ assert_equal(thing.key_value_child[0], thing.key_value_map["one"])
264
+ assert_equal(thing.key_value_child[1], thing.key_value_map["two"])
265
+
266
+ check_parents(thing)
267
+ end
268
+
269
+ def test_parents
270
+ thing = Thing.new
271
+ (kv1 = thing.new_key_value("one")).value = "1"
272
+ (kv2 = thing.new_key_value("two")).value = "2"
273
+
274
+ assert_equal(thing, thing.key_value_child[0].parents[0])
275
+ assert_equal(thing, thing.key_value_child[1].parents[0])
276
+
277
+ another_thing = Thing.new
278
+ another_thing << kv1 << kv2
279
+
280
+ assert_equal(2, kv1.parents.size)
281
+ assert_equal(2, kv2.parents.size)
282
+
283
+ check_parents(thing)
284
+ check_parents(another_thing)
285
+ end
286
+
287
+ def test_non_string_attributes
288
+ stuff1 = Stuff.new
289
+
290
+ stuff1.kind = 123.456
291
+ assert_equal("<ns1:stuff kind='123.456' xmlns:ns1='http://xampl.com/example' xmlns:ns0='http://xampl.com/example/special'/>",
292
+ stuff1.to_xml)
293
+
294
+ stuff1.kind = nil
295
+ assert_equal("<ns1:stuff xmlns:ns1='http://xampl.com/example' xmlns:ns0='http://xampl.com/example/special'/>",
296
+ stuff1.to_xml)
297
+
298
+ stuff1.kind = [1, 2, 3]
299
+ assert_equal("<ns1:stuff kind='123' xmlns:ns1='http://xampl.com/example' xmlns:ns0='http://xampl.com/example/special'/>",
300
+ stuff1.to_xml)
301
+
302
+ stuff2 = Stuff.new
303
+ stuff2.kind = 123
304
+ stuff1.kind = stuff2
305
+ assert_equal("<ns1:stuff kind='&lt;ns1:stuff kind=&apos;123&apos; xmlns:ns1=&apos;http://xampl.com/example&apos; xmlns:ns0=&apos;http://xampl.com/example/special&apos;/&gt;' xmlns:ns1='http://xampl.com/example' xmlns:ns0='http://xampl.com/example/special'/>",
306
+ stuff1.to_xml)
307
+
308
+ thing = Thing.new
309
+ thing.pid = "thing"
310
+ thing << stuff2
311
+ stuff1.kind = thing
312
+ # TODO -- check what happens with a PIDed thing
313
+ assert_equal("<ns1:stuff kind='&lt;ns0:thing pid=&apos;thing&apos; xmlns:ns0=&apos;http://xampl.com/example&apos; xmlns:ns1=&apos;http://xampl.com/example/special&apos;&gt;&lt;ns0:stuff kind=&apos;123&apos;/&gt;&lt;/ns0:thing&gt;' xmlns:ns1='http://xampl.com/example' xmlns:ns0='http://xampl.com/example/special'/>",
314
+ stuff1.to_xml)
315
+
316
+ # TODO -- check round tripping of this stuff
317
+ check_parents(stuff1)
318
+ end
319
+
320
+ def test_registry
321
+ assert_equal([ Emph ], FromXML::registered(Emph::ns_tag))
322
+ assert_equal([ Emph ], FromXML::registered(Emph::tag))
323
+ assert_equal([ Stuff ], FromXML::registered(Stuff::ns_tag))
324
+ assert_equal([ Stuff ], FromXML::registered(Stuff::tag))
325
+
326
+ FromXML::register(Emph::tag, Emph::ns_tag, Emph)
327
+ assert_equal([ Emph ], FromXML::registered(Emph::ns_tag))
328
+ assert_equal([ Emph ], FromXML::registered(Emph::tag))
329
+
330
+ FromXML::register(Emph::tag, Thing::ns_tag, Thing)
331
+ assert_equal([ Emph ], FromXML::registered(Emph::ns_tag))
332
+ assert_equal([ Emph, Thing ], FromXML::registered(Emph::tag))
333
+ end
334
+
335
+ def test_in_memory_persistence_basics
336
+ stuff = Stuff.new
337
+ thing = Thing.new
338
+ thing << stuff
339
+
340
+ assert(!stuff.persist_required)
341
+ assert(thing.persist_required)
342
+ assert(nil == thing.persister)
343
+
344
+ persister = InMemoryPersister.new
345
+
346
+ assert(!persister.write(thing))
347
+
348
+ thing.pid = "thing"
349
+
350
+ assert(persister.write(thing))
351
+
352
+ saved_thing = persister.read(Thing, "thing")
353
+ assert(saved_thing)
354
+
355
+ assert_equal(thing.to_xml, saved_thing.to_xml)
356
+
357
+ Xampl.in_memory_persister("first")
358
+
359
+ stuff = Stuff.new
360
+ thing = Thing.new
361
+ thing.pid = "thing"
362
+ thing << stuff
363
+
364
+ assert_nil(Xampl.lookup(Thing, "thing"))
365
+
366
+ assert(nil == thing.persister)
367
+ assert(thing.is_changed)
368
+ assert(0 == Xampl.count_changed)
369
+ Xampl.introduce_to_persister(thing)
370
+ assert(thing.persister)
371
+ assert_equal(1, Xampl.count_changed)
372
+ assert_equal(thing, Xampl.lookup(Thing, "thing"), "cannot lookup new stuff")
373
+
374
+ #Xampl.print_stats
375
+
376
+ assert_equal(1, Xampl.count_changed)
377
+ writes = Xampl.sync
378
+ assert_equal(1, writes)
379
+ assert_equal(0, Xampl.count_changed)
380
+ assert(Xampl.lookup(Thing, "thing"))
381
+
382
+ assert_equal(thing, Xampl.lookup(Thing, "thing"), "cannot lookup cached stuff")
383
+
384
+ Xampl.clear_cache
385
+
386
+ found = Xampl.lookup(Thing, "thing")
387
+ assert_not_equal(thing, found)
388
+
389
+ #Xampl.print_stats
390
+ end
391
+
392
+ def test_escaping
393
+ description = Description.new
394
+ description.kind = "<>&'\""
395
+ description << "<>&'\""
396
+
397
+ expect = "<ns0:description kind='&lt;&gt;&amp;&apos;&quot;' xmlns:ns0='http://xampl.com/example'>&lt;>&amp;'\"</ns0:description>"
398
+
399
+ assert_equal(expect, description.to_xml)
400
+ end
401
+
402
+ def test_generator
403
+ options = Xampl.make(Options) { | options |
404
+ options.new_index_attribute("name")
405
+ options.new_index_attribute("id")
406
+ options.new_index_attribute("pid").persisted = true
407
+
408
+ options.new_resolve{ | resolver |
409
+ resolver.pkg = "XamplExample"
410
+ resolver.namespace="http://xampl.com/example"
411
+ }
412
+ options.new_resolve{ | resolver |
413
+ resolver.pkg = "XamplExamplePlay"
414
+ resolver.namespace="http://xampl.com/example/play"
415
+ }
416
+ }
417
+ generator = Generator.new(options)
418
+
419
+ generator.comprehend_from_strings([
420
+ %Q{
421
+ <things xmlns='http://xampl.com/example'
422
+ xmlns:xampl='http://xampl.com/example/special'>
423
+ <thing pid=''>
424
+ <description kind=''>blah <emph>blah</emph> blah</description>
425
+ <keyValue id='' value=''/>
426
+ <stuff kind='' xampl:special=''/>
427
+ <thing pid=''/>
428
+ <things/>
429
+ </thing>
430
+ </things>
431
+ }
432
+ ])
433
+
434
+ ns = "http://xampl.com/example"
435
+ emap = generator.elements_map
436
+ assert_equal(1, emap.size)
437
+ elements = emap[ns]
438
+ assert_not_nil(elements)
439
+ assert_equal(6, elements.element_child.size)
440
+
441
+ ename = "emph"
442
+ element = elements.element_map[ename]
443
+ assert_not_nil(element)
444
+ assert_equal(ns, element.namespace)
445
+ assert_equal("{#{ns}}#{ename}", element.nstag)
446
+ assert(!element.empty)
447
+ assert(element.has_content)
448
+
449
+ ename = "description"
450
+ element = elements.element_map[ename]
451
+ assert_not_nil(element)
452
+ assert_equal(ns, element.namespace)
453
+ assert_equal("{#{ns}}#{ename}", element.nstag)
454
+ assert(!element.empty)
455
+ assert(element.has_content)
456
+
457
+ assert_equal(1, element.attribute_child.size)
458
+ assert_not_nil(element.attribute_map["kind"])
459
+ assert_nil(element.attribute_map["kind"].namespace)
460
+
461
+ assert_equal(1, element.child_element_child.size)
462
+ cname = "{#{ns}}emph"
463
+ assert_not_nil(element.child_element_map[cname])
464
+ assert_equal(ns, element.child_element_map[cname].namespace)
465
+ assert_equal("emph", element.child_element_map[cname].element_name)
466
+
467
+ ename = "stuff"
468
+ element = elements.element_map[ename]
469
+ assert_not_nil(element)
470
+ assert_equal(ns, element.namespace)
471
+ assert_equal("{#{ns}}#{ename}", element.nstag)
472
+ assert(element.empty)
473
+ assert(!element.has_content)
474
+
475
+ assert_equal(2, element.attribute_child.size)
476
+ assert_not_nil(element.attribute_map["kind"])
477
+ assert_nil(element.attribute_map["kind"].namespace)
478
+ assert_not_nil(element.attribute_map["special"])
479
+ assert_equal('http://xampl.com/example/special', element.attribute_map["special"].namespace)
480
+
481
+ assert_equal(0, element.child_element_child.size)
482
+
483
+ ename = "keyValue"
484
+ element = elements.element_map[ename]
485
+ assert_not_nil(element)
486
+ assert_equal(ns, element.namespace)
487
+ assert_equal("{#{ns}}#{ename}", element.nstag)
488
+ assert(element.empty)
489
+ assert(!element.has_content)
490
+
491
+ assert_equal(2, element.attribute_child.size)
492
+ assert_not_nil(element.attribute_map["id"])
493
+ assert_nil(element.attribute_map["id"].namespace)
494
+ assert_not_nil(element.attribute_map["value"])
495
+ assert_nil(element.attribute_map["value"].namespace)
496
+
497
+ assert_equal(0, element.child_element_child.size)
498
+
499
+ ename = "thing"
500
+ element = elements.element_map[ename]
501
+ assert_not_nil(element)
502
+ assert_equal(ns, element.namespace)
503
+ assert_equal("{#{ns}}#{ename}", element.nstag)
504
+ assert(element.empty)
505
+ assert(!element.has_content)
506
+
507
+ assert_equal(1, element.attribute_child.size)
508
+ assert_equal(1, element.attribute_map.size)
509
+ assert_not_nil(element.attribute_map["pid"])
510
+ assert_nil(element.attribute_map["pid"].namespace)
511
+
512
+ assert_equal(5, element.child_element_child.size)
513
+
514
+ cname = "{#{ns}}description"
515
+ assert_not_nil(element.child_element_map[cname])
516
+ assert_equal(ns, element.child_element_map[cname].namespace)
517
+ assert_equal("description", element.child_element_map[cname].element_name)
518
+
519
+ cname = "{#{ns}}keyValue"
520
+ assert_not_nil(element.child_element_map[cname])
521
+ assert_equal(ns, element.child_element_map[cname].namespace)
522
+ assert_equal("keyValue", element.child_element_map[cname].element_name)
523
+
524
+ cname = "{#{ns}}stuff"
525
+ assert_not_nil(element.child_element_map[cname])
526
+ assert_equal(ns, element.child_element_map[cname].namespace)
527
+ assert_equal("stuff", element.child_element_map[cname].element_name)
528
+
529
+ cname = "{#{ns}}thing"
530
+ assert_not_nil(element.child_element_map[cname])
531
+ assert_equal(ns, element.child_element_map[cname].namespace)
532
+ assert_equal("thing", element.child_element_map[cname].element_name)
533
+
534
+ cname = "{#{ns}}things"
535
+ assert_not_nil(element.child_element_map[cname])
536
+ assert_equal(ns, element.child_element_map[cname].namespace)
537
+ assert_equal("things", element.child_element_map[cname].element_name)
538
+
539
+ ename = "things"
540
+ element = elements.element_map[ename]
541
+ assert_not_nil(element)
542
+ assert_equal(ns, element.namespace)
543
+ assert_equal("{#{ns}}#{ename}", element.nstag)
544
+ assert(element.empty)
545
+ assert(!element.has_content)
546
+
547
+ assert_equal(0, element.attribute_child.size)
548
+ assert_equal(1, element.child_element_child.size)
549
+
550
+ cname = "{#{ns}}thing"
551
+ assert_not_nil(element.child_element_map[cname])
552
+ assert_equal(ns, element.child_element_map[cname].namespace)
553
+ assert_equal("thing", element.child_element_map[cname].element_name)
554
+
555
+ #generator.print_stats
556
+ #generator.analyse
557
+
558
+ ename = "emph"
559
+ element = elements.element_map[ename]
560
+ assert_equal("simple", element.kind, "emph is wrong kind")
561
+ assert_nil(element.indexed_by)
562
+ assert_nil(element.persisted)
563
+ assert_equal("XamplExample", element.package)
564
+ assert_equal("Emph", element.class_name)
565
+ assert_equal("emph", element.attribute_name)
566
+
567
+ ename = "description"
568
+ element = elements.element_map[ename]
569
+ assert_equal("mixed", element.kind, "description is wrong kind")
570
+ assert_nil(element.indexed_by)
571
+ assert_nil(element.persisted)
572
+ assert_equal("XamplExample", element.package)
573
+ assert_equal("Description", element.class_name)
574
+ assert_equal("description", element.attribute_name)
575
+
576
+ ename = "stuff"
577
+ element = elements.element_map[ename]
578
+ assert_equal("empty", element.kind, "stuff is wrong kind")
579
+ assert_nil(element.indexed_by)
580
+ assert_nil(element.persisted)
581
+ assert_equal("XamplExample", element.package)
582
+ assert_equal("Stuff", element.class_name)
583
+ assert_equal("stuff", element.attribute_name)
584
+
585
+ ename = "keyValue"
586
+ element = elements.element_map[ename]
587
+ assert_equal("empty", element.kind, "keyValue is wrong kind")
588
+ assert_equal("id", element.indexed_by)
589
+ assert_nil(element.persisted)
590
+ assert_equal("XamplExample", element.package)
591
+ assert_equal("KeyValue", element.class_name)
592
+ assert_equal("key_value", element.attribute_name)
593
+
594
+ ename = "thing"
595
+ element = elements.element_map[ename]
596
+ assert_equal("data", element.kind, "thing is wrong kind")
597
+ assert_equal("pid", element.indexed_by)
598
+ assert_not_nil(element.persisted)
599
+ assert_equal("XamplExample", element.package)
600
+ assert_equal("Thing", element.class_name)
601
+ assert_equal("thing", element.attribute_name)
602
+
603
+ generator.generate_to_directory(nil)
604
+ end
605
+
606
+ def test_generator_with_no_namespace
607
+ generator = Generator.new
608
+ generator.comprehend_from_strings([
609
+ %Q{
610
+ <things xmlns:xampl='http://xampl.com/example/special'>
611
+ <thing pid=''>
612
+ <description kind=''>blah <emph>blah</emph> blah</description>
613
+ <keyValue id='' value=''/>
614
+ <stuff kind='' xampl:special=''/>
615
+ <thing pid=''/>
616
+ <things/>
617
+ </thing>
618
+ </things>
619
+ }
620
+ ])
621
+
622
+ ns = ""
623
+ #ns = nil
624
+ emap = generator.elements_map
625
+ assert_equal(1, emap.size)
626
+ elements = emap[ns]
627
+ assert_not_nil(elements)
628
+ assert_equal(6, elements.element_child.size)
629
+
630
+ ename = "emph"
631
+ element = elements.element_map[ename]
632
+ assert_not_nil(element)
633
+ assert_equal(ns, element.namespace)
634
+ assert_equal("{#{ns}}#{ename}", element.nstag)
635
+ assert(!element.empty)
636
+ assert(element.has_content)
637
+
638
+ ename = "description"
639
+ element = elements.element_map[ename]
640
+ assert_not_nil(element)
641
+ assert_equal(ns, element.namespace)
642
+ assert_equal("{#{ns}}#{ename}", element.nstag)
643
+ assert(!element.empty)
644
+ assert(element.has_content)
645
+
646
+ assert_equal(1, element.attribute_child.size)
647
+ assert_not_nil(element.attribute_map["kind"])
648
+ assert_nil(element.attribute_map["kind"].namespace)
649
+
650
+ assert_equal(1, element.child_element_child.size)
651
+ cname = "{#{ns}}emph"
652
+ assert_not_nil(element.child_element_map[cname])
653
+ assert_equal(ns, element.child_element_map[cname].namespace)
654
+ assert_equal("emph", element.child_element_map[cname].element_name)
655
+
656
+ ename = "stuff"
657
+ element = elements.element_map[ename]
658
+ assert_not_nil(element)
659
+ assert_equal(ns, element.namespace)
660
+ assert_equal("{#{ns}}#{ename}", element.nstag)
661
+ assert(element.empty)
662
+ assert(!element.has_content)
663
+
664
+ assert_equal(2, element.attribute_child.size)
665
+ assert_not_nil(element.attribute_map["kind"])
666
+ assert_nil(element.attribute_map["kind"].namespace)
667
+ assert_not_nil(element.attribute_map["special"])
668
+ assert_equal('http://xampl.com/example/special', element.attribute_map["special"].namespace)
669
+
670
+ assert_equal(0, element.child_element_child.size)
671
+
672
+ ename = "keyValue"
673
+ element = elements.element_map[ename]
674
+ assert_not_nil(element)
675
+ assert_equal(ns, element.namespace)
676
+ assert_equal("{#{ns}}#{ename}", element.nstag)
677
+ assert(element.empty)
678
+ assert(!element.has_content)
679
+
680
+ assert_equal(2, element.attribute_child.size)
681
+ assert_not_nil(element.attribute_map["id"])
682
+ assert_nil(element.attribute_map["id"].namespace)
683
+ assert_not_nil(element.attribute_map["value"])
684
+ assert_nil(element.attribute_map["value"].namespace)
685
+
686
+ assert_equal(0, element.child_element_child.size)
687
+
688
+ ename = "thing"
689
+ element = elements.element_map[ename]
690
+ assert_not_nil(element)
691
+ assert_equal(ns, element.namespace)
692
+ assert_equal("{#{ns}}#{ename}", element.nstag)
693
+ assert(element.empty)
694
+ assert(!element.has_content)
695
+
696
+ assert_equal(1, element.attribute_child.size)
697
+ assert_equal(1, element.attribute_map.size)
698
+ assert_not_nil(element.attribute_map["pid"])
699
+ assert_nil(element.attribute_map["pid"].namespace)
700
+
701
+ assert_equal(5, element.child_element_child.size)
702
+
703
+ cname = "{#{ns}}description"
704
+ assert_not_nil(element.child_element_map[cname])
705
+ assert_equal(ns, element.child_element_map[cname].namespace)
706
+ assert_equal("description", element.child_element_map[cname].element_name)
707
+
708
+ cname = "{#{ns}}keyValue"
709
+ assert_not_nil(element.child_element_map[cname])
710
+ assert_equal(ns, element.child_element_map[cname].namespace)
711
+ assert_equal("keyValue", element.child_element_map[cname].element_name)
712
+
713
+ cname = "{#{ns}}stuff"
714
+ assert_not_nil(element.child_element_map[cname])
715
+ assert_equal(ns, element.child_element_map[cname].namespace)
716
+ assert_equal("stuff", element.child_element_map[cname].element_name)
717
+
718
+ cname = "{#{ns}}thing"
719
+ assert_not_nil(element.child_element_map[cname])
720
+ assert_equal(ns, element.child_element_map[cname].namespace)
721
+ assert_equal("thing", element.child_element_map[cname].element_name)
722
+
723
+ cname = "{#{ns}}things"
724
+ assert_not_nil(element.child_element_map[cname])
725
+ assert_equal(ns, element.child_element_map[cname].namespace)
726
+ assert_equal("things", element.child_element_map[cname].element_name)
727
+
728
+ ename = "things"
729
+ element = elements.element_map[ename]
730
+ assert_not_nil(element)
731
+ assert_equal(ns, element.namespace)
732
+ assert_equal("{#{ns}}#{ename}", element.nstag)
733
+ assert(element.empty)
734
+ assert(!element.has_content)
735
+
736
+ assert_equal(0, element.attribute_child.size)
737
+ assert_equal(1, element.child_element_child.size)
738
+
739
+ cname = "{#{ns}}thing"
740
+ assert_not_nil(element.child_element_map[cname])
741
+ assert_equal(ns, element.child_element_map[cname].namespace)
742
+ assert_equal("thing", element.child_element_map[cname].element_name)
743
+
744
+ #generator.print_stats
745
+ #generator.analyse
746
+
747
+ ename = "emph"
748
+ element = elements.element_map[ename]
749
+ assert_equal("simple", element.kind, "emph is wrong kind")
750
+ assert_nil(element.indexed_by)
751
+ assert_nil(element.persisted)
752
+ assert_equal("XamplAdHoc", element.package)
753
+ assert_equal("Emph", element.class_name)
754
+ assert_equal("emph", element.attribute_name)
755
+
756
+ ename = "description"
757
+ element = elements.element_map[ename]
758
+ assert_equal("mixed", element.kind, "description is wrong kind")
759
+ assert_nil(element.indexed_by)
760
+ assert_nil(element.persisted)
761
+ assert_equal("XamplAdHoc", element.package)
762
+ assert_equal("Description", element.class_name)
763
+ assert_equal("description", element.attribute_name)
764
+
765
+ ename = "stuff"
766
+ element = elements.element_map[ename]
767
+ assert_equal("empty", element.kind, "stuff is wrong kind")
768
+ assert_nil(element.indexed_by)
769
+ assert_nil(element.persisted)
770
+ assert_equal("XamplAdHoc", element.package)
771
+ assert_equal("Stuff", element.class_name)
772
+ assert_equal("stuff", element.attribute_name)
773
+
774
+ ename = "keyValue"
775
+ element = elements.element_map[ename]
776
+ assert_equal("empty", element.kind, "keyValue is wrong kind")
777
+ assert_equal("id", element.indexed_by)
778
+ assert_nil(element.persisted)
779
+ assert_equal("XamplAdHoc", element.package)
780
+ assert_equal("KeyValue", element.class_name)
781
+ assert_equal("key_value", element.attribute_name)
782
+
783
+ ename = "thing"
784
+ element = elements.element_map[ename]
785
+ assert_equal("data", element.kind, "thing is wrong kind")
786
+ assert_equal("pid", element.indexed_by)
787
+ assert_not_nil(element.persisted)
788
+ assert_equal("XamplAdHoc", element.package)
789
+ assert_equal("Thing", element.class_name)
790
+ assert_equal("thing", element.attribute_name)
791
+
792
+ generator.generate_to_directory(nil)
793
+ end
794
+
795
+ def choose_name_test_helper(name, expected_class_name, expected_attribute_name)
796
+ original_name = name.dup
797
+ class_name, attribute_name = Generator.choose_names(name)
798
+ assert_equal(original_name, name, "changed the original name")
799
+ assert_equal(expected_class_name, class_name, "CLASS name wrong")
800
+ assert_equal(expected_attribute_name, attribute_name, "ATTRIBUTE name wrong")
801
+ end
802
+
803
+ def test_choose_names
804
+ choose_name_test_helper("abcd", "Abcd", "abcd")
805
+ choose_name_test_helper("Abcd", "Abcd", "abcd")
806
+ choose_name_test_helper("abCd", "AbCd", "ab_cd")
807
+ choose_name_test_helper("AbCd", "AbCd", "ab_cd")
808
+ choose_name_test_helper("ABcd", "ABcd", "abcd")
809
+
810
+ choose_name_test_helper("ABcdefABCdef", "ABcdefABCdef", "abcdef_abcdef")
811
+
812
+ choose_name_test_helper("ab-cd", "AbCd", "ab_cd")
813
+ choose_name_test_helper("Ab-Cd", "AbCd", "ab_cd")
814
+
815
+ choose_name_test_helper("ab--cd", "AbCd", "ab_cd")
816
+ choose_name_test_helper("Ab--Cd", "AbCd", "ab_cd")
817
+
818
+ choose_name_test_helper("ab_-cd", "AbCd", "ab_cd")
819
+ choose_name_test_helper("Ab_-Cd", "AbCd", "ab_cd")
820
+
821
+ choose_name_test_helper("ab__cd", "AbCd", "ab_cd")
822
+ choose_name_test_helper("Ab__Cd", "AbCd", "ab_cd")
823
+
824
+ choose_name_test_helper("ab:cd", "AbCd", "ab_cd")
825
+ choose_name_test_helper("Ab:Cd", "AbCd", "ab_cd")
826
+ end
827
+
828
+ # TODO -- test no namespace
829
+
830
+ def test_bug_indexed_child_same_pid_added_twice
831
+ element = Element.new
832
+ attr0 = element.new_attribute("repeated")
833
+
834
+ assert_equal(1, element.attribute_map.size)
835
+ assert_equal(1, element.attribute_child.size)
836
+ assert_equal(1, element.children.size)
837
+ assert_equal(attr0, element.children[0])
838
+
839
+ ce1 = element.new_child_element("something")
840
+
841
+ assert_equal(1, element.attribute_map.size)
842
+ assert_equal(1, element.attribute_child.size)
843
+ assert_equal(2, element.children.size)
844
+ assert_equal(attr0, element.children[0])
845
+ assert_equal(ce1, element.children[1])
846
+
847
+ attr2 = element.new_attribute("repeated")
848
+
849
+ assert_equal(1, element.attribute_map.size)
850
+ assert_equal(1, element.attribute_child.size)
851
+ assert_equal(2, element.children.size)
852
+ assert_equal(ce1, element.children[0])
853
+ assert_equal(attr2, element.children[1])
854
+ end
855
+
856
+ def check_parents(xampl, parent=nil)
857
+ if (nil != parent) then
858
+ found = false
859
+ xampl.parents.each{ | p |
860
+ found = true if (parent == p)
861
+ }
862
+ assert(found)
863
+ else
864
+ if (xampl.kind_of? XamplObject)
865
+ assert((nil == xampl.parents) || (0 == xampl.parents.size))
866
+ end
867
+ end
868
+ xampl.children.each{ | child |
869
+ check_parents(child, xampl) if (child.kind_of? XamplObject)
870
+ }
871
+ end
872
+ end
873
+