rkwalify 1.4.0.pre.preview1

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 (247) hide show
  1. checksums.yaml +7 -0
  2. data/.github/workflows/ruby.yml +39 -0
  3. data/.gitignore +61 -0
  4. data/.overcommit.yml +33 -0
  5. data/.rubocop.yml +9 -0
  6. data/.rubocop_todo.yml +1369 -0
  7. data/.ruby-version +1 -0
  8. data/Attic/README-0.7.2.md +53 -0
  9. data/Attic/features/cli.feature +9 -0
  10. data/Attic/features/step_definitions/validation_steps.rb +20 -0
  11. data/Attic/features/support/env.rb +4 -0
  12. data/Attic/features/validate_schema.feature +12 -0
  13. data/Attic/s+h +53 -0
  14. data/Attic/setup.rb +1556 -0
  15. data/Attic/spec/my_cli_tool_spec.rb +52 -0
  16. data/Attic/spec/rspec-ex_spec.rb +10 -0
  17. data/Attic/spec/spec_helper.rb +104 -0
  18. data/Attic/test-15.1.rb +28 -0
  19. data/CHANGELOG.md +292 -0
  20. data/CONTRIBUTING.md +23 -0
  21. data/CONTRIBUTORS.md +8 -0
  22. data/Gemfile +16 -0
  23. data/Gemfile.lock +146 -0
  24. data/MIT-LICENSE +21 -0
  25. data/README.md +53 -0
  26. data/ROLL-OUT-STRATEGY.md +77 -0
  27. data/Rakefile +11 -0
  28. data/bin/kwalify.rb +4167 -0
  29. data/bin/kwalify.schema.yaml +59 -0
  30. data/contrib/inline-require +181 -0
  31. data/contrib/kwalify +4167 -0
  32. data/contrib/kwalify-0.7.2 +4160 -0
  33. data/devbin/README.md +22 -0
  34. data/devbin/chk-rad-repo.sh +20 -0
  35. data/devbin/chkcopyrights.sh +42 -0
  36. data/devbin/chkspelling.sh +16 -0
  37. data/devbin/got-all-rel-numbers.sh +5 -0
  38. data/devbin/mkbig-rkwalify.sh +7 -0
  39. data/devbin/mkgem_file.sh +5 -0
  40. data/devbin/runtests.sh +6 -0
  41. data/devbin/ug-tests.golden +242 -0
  42. data/devbin/ug-tests.sh +145 -0
  43. data/devbin/update-rel-numbers.sh +7 -0
  44. data/doc/docstyle.css +188 -0
  45. data/doc/img/fig01.png +0 -0
  46. data/doc/users-guide.html +2051 -0
  47. data/doc-api/classes/CommandOptionError.html +184 -0
  48. data/doc-api/classes/CommandOptionParser.html +325 -0
  49. data/doc-api/classes/Kwalify/AssertionError.html +148 -0
  50. data/doc-api/classes/Kwalify/BaseError.html +297 -0
  51. data/doc-api/classes/Kwalify/BaseParser.html +461 -0
  52. data/doc-api/classes/Kwalify/CommandOptionError.html +168 -0
  53. data/doc-api/classes/Kwalify/ErrorHelper.html +223 -0
  54. data/doc-api/classes/Kwalify/HashInterface.html +118 -0
  55. data/doc-api/classes/Kwalify/Json.html +105 -0
  56. data/doc-api/classes/Kwalify/KwalifyError.html +111 -0
  57. data/doc-api/classes/Kwalify/Main.html +339 -0
  58. data/doc-api/classes/Kwalify/MetaValidator.html +448 -0
  59. data/doc-api/classes/Kwalify/Parser.html +155 -0
  60. data/doc-api/classes/Kwalify/PlainYamlParser/Alias.html +165 -0
  61. data/doc-api/classes/Kwalify/PlainYamlParser.html +523 -0
  62. data/doc-api/classes/Kwalify/Rule.html +433 -0
  63. data/doc-api/classes/Kwalify/SchemaError.html +148 -0
  64. data/doc-api/classes/Kwalify/SyntaxError.html +185 -0
  65. data/doc-api/classes/Kwalify/Types.html +302 -0
  66. data/doc-api/classes/Kwalify/Util/HashLike.html +246 -0
  67. data/doc-api/classes/Kwalify/Util/OrderedHash.html +330 -0
  68. data/doc-api/classes/Kwalify/Util.html +390 -0
  69. data/doc-api/classes/Kwalify/ValidationError.html +148 -0
  70. data/doc-api/classes/Kwalify/Validator.html +381 -0
  71. data/doc-api/classes/Kwalify/Yaml/Parser.html +1538 -0
  72. data/doc-api/classes/Kwalify/Yaml.html +194 -0
  73. data/doc-api/classes/Kwalify/YamlParser.html +542 -0
  74. data/doc-api/classes/Kwalify/YamlSyntaxError.html +119 -0
  75. data/doc-api/classes/Kwalify.html +292 -0
  76. data/doc-api/classes/Test/Unit.html +101 -0
  77. data/doc-api/classes/Test.html +107 -0
  78. data/doc-api/created.rid +1 -0
  79. data/doc-api/files/__/README_txt.html +153 -0
  80. data/doc-api/files/kwalify/errors_rb.html +114 -0
  81. data/doc-api/files/kwalify/main_rb.html +118 -0
  82. data/doc-api/files/kwalify/messages_rb.html +107 -0
  83. data/doc-api/files/kwalify/meta-validator_rb.html +117 -0
  84. data/doc-api/files/kwalify/parser/base_rb.html +116 -0
  85. data/doc-api/files/kwalify/parser/yaml_rb.html +117 -0
  86. data/doc-api/files/kwalify/rule_rb.html +116 -0
  87. data/doc-api/files/kwalify/types_rb.html +114 -0
  88. data/doc-api/files/kwalify/util/assert-text-equal_rb.html +115 -0
  89. data/doc-api/files/kwalify/util/hash-interface_rb.html +114 -0
  90. data/doc-api/files/kwalify/util/hashlike_rb.html +107 -0
  91. data/doc-api/files/kwalify/util/option-parser_rb.html +107 -0
  92. data/doc-api/files/kwalify/util/ordered-hash_rb.html +107 -0
  93. data/doc-api/files/kwalify/util/testcase-helper_rb.html +115 -0
  94. data/doc-api/files/kwalify/util_rb.html +107 -0
  95. data/doc-api/files/kwalify/validator_rb.html +117 -0
  96. data/doc-api/files/kwalify/yaml-parser_rb.html +117 -0
  97. data/doc-api/files/kwalify_rb.html +121 -0
  98. data/doc-api/fr_class_index.html +57 -0
  99. data/doc-api/fr_file_index.html +45 -0
  100. data/doc-api/fr_method_index.html +168 -0
  101. data/doc-api/index.html +24 -0
  102. data/doc-api/rdoc-style.css +208 -0
  103. data/examples/address-book/Makefile +10 -0
  104. data/examples/address-book/address-book.schema.yaml +45 -0
  105. data/examples/address-book/address-book.yaml +36 -0
  106. data/examples/data-binding/BABEL.data.yaml +63 -0
  107. data/examples/data-binding/BABEL.schema.yaml +31 -0
  108. data/examples/data-binding/Makefile +8 -0
  109. data/examples/data-binding/Rakefile +13 -0
  110. data/examples/data-binding/main.rb +25 -0
  111. data/examples/invoice/Makefile +9 -0
  112. data/examples/invoice/invoice.schema.yaml +43 -0
  113. data/examples/invoice/invoice.yaml +32 -0
  114. data/examples/tapkit/Makefile +10 -0
  115. data/examples/tapkit/main.rb +7 -0
  116. data/examples/tapkit/tapkit.schema.yaml +146 -0
  117. data/examples/tapkit/tapkit.yaml +85 -0
  118. data/lib/kwalify/errors.rb +127 -0
  119. data/lib/kwalify/kwalify.schema.yaml +58 -0
  120. data/lib/kwalify/main.rb +442 -0
  121. data/lib/kwalify/messages.rb +173 -0
  122. data/lib/kwalify/meta-validator.rb +276 -0
  123. data/lib/kwalify/parser/base.rb +128 -0
  124. data/lib/kwalify/parser/yaml.rb +841 -0
  125. data/lib/kwalify/rule.rb +562 -0
  126. data/lib/kwalify/templates/genclass-java.eruby +222 -0
  127. data/lib/kwalify/templates/genclass-php.eruby +104 -0
  128. data/lib/kwalify/templates/genclass-ruby.eruby +113 -0
  129. data/lib/kwalify/types.rb +156 -0
  130. data/lib/kwalify/util/assert-text-equal.rb +46 -0
  131. data/lib/kwalify/util/hash-interface.rb +18 -0
  132. data/lib/kwalify/util/hashlike.rb +51 -0
  133. data/lib/kwalify/util/option-parser.rb +220 -0
  134. data/lib/kwalify/util/ordered-hash.rb +57 -0
  135. data/lib/kwalify/util/testcase-helper.rb +112 -0
  136. data/lib/kwalify/util.rb +159 -0
  137. data/lib/kwalify/validator.rb +282 -0
  138. data/lib/kwalify/version.rb +5 -0
  139. data/lib/kwalify/yaml-parser.rb +871 -0
  140. data/lib/kwalify.rb +61 -0
  141. data/rkwalify.gemspec +26 -0
  142. data/test/Rookbook.yaml +15 -0
  143. data/test/data/users-guide/AddressBook.java.expected +40 -0
  144. data/test/data/users-guide/BABEL.data.yaml +24 -0
  145. data/test/data/users-guide/BABEL.schema.yaml +30 -0
  146. data/test/data/users-guide/ExampleAddressBook.java +47 -0
  147. data/test/data/users-guide/Group.java.expected +24 -0
  148. data/test/data/users-guide/Person.java.expected +44 -0
  149. data/test/data/users-guide/address_book.rb +52 -0
  150. data/test/data/users-guide/address_book.schema.yaml +28 -0
  151. data/test/data/users-guide/address_book.yaml +27 -0
  152. data/test/data/users-guide/answers-schema.yaml +12 -0
  153. data/test/data/users-guide/answers-validator.rb +53 -0
  154. data/test/data/users-guide/babel_genclass.result +26 -0
  155. data/test/data/users-guide/config.schema.yaml +7 -0
  156. data/test/data/users-guide/config.yaml +4 -0
  157. data/test/data/users-guide/document01a.yaml +3 -0
  158. data/test/data/users-guide/document01b.yaml +3 -0
  159. data/test/data/users-guide/document02a.yaml +4 -0
  160. data/test/data/users-guide/document02b.yaml +4 -0
  161. data/test/data/users-guide/document03a.yaml +6 -0
  162. data/test/data/users-guide/document03b.yaml +6 -0
  163. data/test/data/users-guide/document04a.yaml +9 -0
  164. data/test/data/users-guide/document04b.yaml +9 -0
  165. data/test/data/users-guide/document05a.yaml +11 -0
  166. data/test/data/users-guide/document05b.yaml +12 -0
  167. data/test/data/users-guide/document06a.yaml +15 -0
  168. data/test/data/users-guide/document06b.yaml +16 -0
  169. data/test/data/users-guide/document07a.yaml +9 -0
  170. data/test/data/users-guide/document07b.yaml +7 -0
  171. data/test/data/users-guide/document12a.json +10 -0
  172. data/test/data/users-guide/document12b.json +6 -0
  173. data/test/data/users-guide/document13a.yaml +17 -0
  174. data/test/data/users-guide/document14a.yaml +3 -0
  175. data/test/data/users-guide/document14b.yaml +3 -0
  176. data/test/data/users-guide/document15a.yaml +6 -0
  177. data/test/data/users-guide/document15b.yaml +5 -0
  178. data/test/data/users-guide/example_address_book.rb +11 -0
  179. data/test/data/users-guide/example_address_book_java.result +32 -0
  180. data/test/data/users-guide/example_address_book_ruby.result +31 -0
  181. data/test/data/users-guide/genclass_java.result +4 -0
  182. data/test/data/users-guide/howto-validation-with-parsing.rb +28 -0
  183. data/test/data/users-guide/howto-validation.rb +25 -0
  184. data/test/data/users-guide/howto3.rb +6 -0
  185. data/test/data/users-guide/howto3.result +5 -0
  186. data/test/data/users-guide/howto3.yaml +8 -0
  187. data/test/data/users-guide/howto5_databinding.result +111 -0
  188. data/test/data/users-guide/invalid01.result +3 -0
  189. data/test/data/users-guide/invalid02.result +5 -0
  190. data/test/data/users-guide/invalid03.result +5 -0
  191. data/test/data/users-guide/invalid04.result +4 -0
  192. data/test/data/users-guide/invalid05.result +11 -0
  193. data/test/data/users-guide/invalid06.result +4 -0
  194. data/test/data/users-guide/invalid07.result +3 -0
  195. data/test/data/users-guide/invalid08.result +3 -0
  196. data/test/data/users-guide/invalid12.json +8 -0
  197. data/test/data/users-guide/invalid14.result +4 -0
  198. data/test/data/users-guide/invalid15.result +4 -0
  199. data/test/data/users-guide/loadbabel.rb +27 -0
  200. data/test/data/users-guide/loadconfig.rb +17 -0
  201. data/test/data/users-guide/loadconfig.result +6 -0
  202. data/test/data/users-guide/models.rb +24 -0
  203. data/test/data/users-guide/option_ha.result +6 -0
  204. data/test/data/users-guide/option_ha_genclass_java.result +7 -0
  205. data/test/data/users-guide/schema01.yaml +3 -0
  206. data/test/data/users-guide/schema02.yaml +12 -0
  207. data/test/data/users-guide/schema03.yaml +9 -0
  208. data/test/data/users-guide/schema04.yaml +20 -0
  209. data/test/data/users-guide/schema05.yaml +29 -0
  210. data/test/data/users-guide/schema06.yaml +11 -0
  211. data/test/data/users-guide/schema12.json +12 -0
  212. data/test/data/users-guide/schema13.yaml +13 -0
  213. data/test/data/users-guide/schema14.yaml +5 -0
  214. data/test/data/users-guide/schema15.yaml +21 -0
  215. data/test/data/users-guide/valid01.result +2 -0
  216. data/test/data/users-guide/valid02.result +2 -0
  217. data/test/data/users-guide/valid03.result +2 -0
  218. data/test/data/users-guide/valid04.result +2 -0
  219. data/test/data/users-guide/valid05.result +2 -0
  220. data/test/data/users-guide/valid06.result +2 -0
  221. data/test/data/users-guide/valid07.result +2 -0
  222. data/test/data/users-guide/valid08.result +2 -0
  223. data/test/data/users-guide/valid12.result +2 -0
  224. data/test/data/users-guide/valid13.result +2 -0
  225. data/test/data/users-guide/valid14.result +2 -0
  226. data/test/data/users-guide/valid15.result +2 -0
  227. data/test/data/users-guide/validate08.rb +37 -0
  228. data/test/test-action.rb +73 -0
  229. data/test/test-action.yaml +738 -0
  230. data/test/test-databinding.rb +84 -0
  231. data/test/test-databinding.yaml +339 -0
  232. data/test/test-main.rb +156 -0
  233. data/test/test-main.yaml +409 -0
  234. data/test/test-metavalidator.rb +80 -0
  235. data/test/test-metavalidator.yaml +1179 -0
  236. data/test/test-parser-yaml.rb +57 -0
  237. data/test/test-parser-yaml.yaml +1750 -0
  238. data/test/test-rule.rb +26 -0
  239. data/test/test-rule.yaml +317 -0
  240. data/test/test-users-guide.rb +82 -0
  241. data/test/test-util.rb +125 -0
  242. data/test/test-validator.rb +95 -0
  243. data/test/test-validator.yaml +986 -0
  244. data/test/test-yaml-parser.rb +47 -0
  245. data/test/test-yaml-parser.yaml +1226 -0
  246. data/test/test.rb +75 -0
  247. metadata +293 -0
@@ -0,0 +1,84 @@
1
+ ###
2
+ ### $Rev$
3
+ ### $Release: 1.4.0-preview1 $
4
+ ### copyright(c) 2005-2010 kuwata-lab all rights reserved.
5
+ ###
6
+ # frozen_string_literal: false
7
+
8
+ require File.dirname(__FILE__) + '/test.rb'
9
+
10
+
11
+ class DataBindingTest < Test::Unit::TestCase
12
+
13
+
14
+ ## define test methods
15
+ filename = __FILE__.sub(/\.rb$/, '.yaml')
16
+ input = Kwalify::Util.untabify(File.read(filename))
17
+ TESTDATA1 = {}
18
+ YAML.load_stream(input) do |ydoc|
19
+ hash_list = ydoc
20
+ hash_list.each do |hash|
21
+ for key in hash.keys()
22
+ hash[key[0..-2]] = hash.delete(key)['ruby'] if key[-1] == ?*
23
+ end
24
+ name = hash['name'] or raise "name is not found."
25
+ TESTDATA1.key?(name) and raise "name '#{name}' is dupilcated."
26
+ TESTDATA1[name] = hash
27
+ #
28
+ s = ''
29
+ s << "def test_#{name}\n"
30
+ s << " @name = '#{name}'\n"
31
+ for key, val in hash
32
+ s << " @#{key} = TESTDATA1['#{name}']['#{key}']\n"
33
+ end
34
+ s << " _test\n"
35
+ s << "end\n"
36
+ eval s
37
+ end
38
+ end
39
+ load_yaml_testdata(filename, :lang=>'ruby')
40
+
41
+
42
+ def _test
43
+ ## schema
44
+ if @schema.is_a?(String)
45
+ @schema = Kwalify::Yaml::Parser.new.parse(@schema, :untabify=>true)
46
+ #@schema = YAML.load(Kwalify::Util.untabify(@schema))
47
+ end
48
+ ## data binding
49
+ #Object.class_eval {@classdef} if @classdef
50
+ if @classdef
51
+ Object.class_eval @classdef
52
+ end
53
+ validator = Kwalify::Validator.new(@schema)
54
+ parser = Kwalify::Yaml::Parser.new(validator, :data_binding=>true)
55
+ @testopts ||= {}
56
+ parser.preceding_alias = true if @testopts['preceding_alias']
57
+ ydoc = parser.parse(@data)
58
+ assert_equal(parser.errors, [])
59
+ ## pp
60
+ result = ''
61
+ def result.write(arg); self << arg.to_s; end
62
+ PP.pp(ydoc, result)
63
+ ## convert object-id to portable number
64
+ table = {}
65
+ counter = 0
66
+ result.gsub!(/:0x\w+/) {|m| ":0x%03d" % (table[m] ||= (counter+=1)) }
67
+ ## assert
68
+ #puts result
69
+ assert_text_equal(@expected, result)
70
+ ## path, linenum, column
71
+ if @locations
72
+ #t = parser.instance_variable_get("@location_table")
73
+ #require 'pp'
74
+ #pp t
75
+ @locations.each do |path, expected_linenum, expected_column|
76
+ linenum, column = parser.location(path)
77
+ assert_equal(expected_linenum, linenum)
78
+ assert_equal(expected_column, column)
79
+ end
80
+ end
81
+ end
82
+
83
+
84
+ end
@@ -0,0 +1,339 @@
1
+ ##
2
+ ## $Rev: 63 $
3
+ ## $Release: 1.4.0-preview1 $
4
+ ## copyright(c) 2005-2010 kuwata-lab all rights reserved.
5
+ ##
6
+ ---
7
+
8
+ - name: databind1
9
+ desc: sequence of mapping
10
+ schema: |
11
+ type: seq
12
+ sequence:
13
+ - type: map
14
+ class: My1::Address
15
+ mapping:
16
+ "name": { type: str, required: yes }
17
+ "tel": { type: str }
18
+ "email": { type: str }
19
+ "age": { type: int }
20
+ "birth": { type: date }
21
+ "blood": { type: str, enum: [A, B, O, AB] }
22
+ classdef*:
23
+ ruby: |
24
+ require 'kwalify/util/hashlike'
25
+ module ::My1
26
+ class Address
27
+ include Kwalify::Util::HashLike
28
+ attr_accessor :name, :tel, :email, :age, :birth, :blood
29
+ end
30
+ end
31
+
32
+ data: |
33
+ - name: Foo
34
+ tel: 012-345-7777
35
+ email: foo@mail.com
36
+ age: 15
37
+ birth: 1990-01-01
38
+ blood: A
39
+ - name: Bar
40
+ tel: 012-345-8889
41
+ email: bar@mail.org
42
+ age: 14
43
+ birth: 1991-01-02
44
+ - name: Foo
45
+ tel: 012-345-9999
46
+ email: baz@mail.net
47
+ age: 13
48
+ birth: 1992-01-03
49
+ blood: AB
50
+ expected*:
51
+ ruby: |
52
+ [#<My1::Address:0x001
53
+ @age=15,
54
+ @birth=#<Date: 1990-01-01 ((2447893j,0s,0n),+0s,2299161j)>,
55
+ @blood="A",
56
+ @email="foo@mail.com",
57
+ @name="Foo",
58
+ @tel="012-345-7777">,
59
+ #<My1::Address:0x002
60
+ @age=14,
61
+ @birth=#<Date: 1991-01-02 ((2448259j,0s,0n),+0s,2299161j)>,
62
+ @email="bar@mail.org",
63
+ @name="Bar",
64
+ @tel="012-345-8889">,
65
+ #<My1::Address:0x003
66
+ @age=13,
67
+ @birth=#<Date: 1992-01-03 ((2448625j,0s,0n),+0s,2299161j)>,
68
+ @blood="AB",
69
+ @email="baz@mail.net",
70
+ @name="Foo",
71
+ @tel="012-345-9999">]
72
+ locations:
73
+ - [ "/0", 1, 3 ]
74
+ - [ "/0/name", 1, 10 ]
75
+ - [ "/0/tel", 2, 10 ]
76
+ - [ "/0/email", 3, 10 ]
77
+ - [ "/0/age", 4, 10 ]
78
+ - [ "/0/birth", 5, 10 ]
79
+ - [ "/0/blood", 6, 10 ]
80
+ - [ "/1", 7, 3 ]
81
+ - [ "/1/name", 7, 10 ]
82
+ - [ "/1/tel", 8, 10 ]
83
+ - [ "/1/email", 9, 10 ]
84
+ - [ "/1/age", 10, 10 ]
85
+ - [ "/1/birth", 11, 10 ]
86
+ - [ "/2", 12, 3 ]
87
+ - [ "/2/name", 12, 10 ]
88
+ - [ "/2/tel", 13, 10 ]
89
+ - [ "/2/email", 14, 10 ]
90
+ - [ "/2/age", 15, 10 ]
91
+ - [ "/2/birth", 16, 10 ]
92
+
93
+
94
+ - name: databind2
95
+ desc: recursive binding
96
+ schema: &context_schema |
97
+ type: map
98
+ class: My2::Context
99
+ mapping:
100
+ "groups":
101
+ type: seq
102
+ sequence:
103
+ - type: map
104
+ class: My2::Group
105
+ mapping:
106
+ "name":
107
+ type: str
108
+ required: yes
109
+ "desc":
110
+ type: str
111
+ "owner": &userschema
112
+ type: map
113
+ class: My2::User
114
+ mapping:
115
+ "name":
116
+ type: str
117
+ required: yes
118
+ "desc":
119
+ type: str
120
+ "gender":
121
+ type: bool
122
+ "mail":
123
+ type: str
124
+ "manager": *userschema
125
+ "users":
126
+ type: seq
127
+ sequence:
128
+ - *userschema
129
+
130
+ classdef*: &context_classdef
131
+ ruby: |
132
+ require 'kwalify/util/hashlike'
133
+ module ::My2
134
+
135
+ class Context
136
+ include Kwalify::Util::HashLike
137
+ attr_accessor :groups # seq
138
+ attr_accessor :users # seq
139
+ end
140
+
141
+ class Group
142
+ include Kwalify::Util::HashLike
143
+ attr_accessor :name # str
144
+ attr_accessor :desc # str
145
+ attr_accessor :owner # map
146
+ end
147
+
148
+ class User
149
+ include Kwalify::Util::HashLike
150
+ attr_accessor :name # str
151
+ attr_accessor :gender # bool
152
+ attr_accessor :mail # str
153
+ attr_accessor :desc # str
154
+ attr_accessor :manager # map
155
+ end
156
+
157
+ end
158
+
159
+ data: |
160
+ groups:
161
+ - name: admin
162
+ desc: administrator group
163
+ owner: &root
164
+ name: root
165
+ desc: root user
166
+ - name: users
167
+ desc: user group
168
+ owner: &guest
169
+ name: guest
170
+ desc: guest user
171
+ users:
172
+ - *root
173
+ - *guest
174
+ - &user1
175
+ name: user1
176
+ - name: user2
177
+ manager: *user1
178
+
179
+ expected*:
180
+ ruby: |
181
+ #<My2::Context:0x001
182
+ @groups=
183
+ [#<My2::Group:0x002
184
+ @desc="administrator group",
185
+ @name="admin",
186
+ @owner=#<My2::User:0x003 @desc="root user", @name="root">>,
187
+ #<My2::Group:0x004
188
+ @desc="user group",
189
+ @name="users",
190
+ @owner=#<My2::User:0x005 @desc="guest user", @name="guest">>],
191
+ @users=
192
+ [#<My2::User:0x003 @desc="root user", @name="root">,
193
+ #<My2::User:0x005 @desc="guest user", @name="guest">,
194
+ #<My2::User:0x006 @name="user1">,
195
+ #<My2::User:0x007
196
+ @manager=#<My2::User:0x006 @name="user1">,
197
+ @name="user2">]>
198
+
199
+ locations:
200
+ - [ "/", 1, 1 ]
201
+ - [ "/groups", 2, 3 ]
202
+ - [ "/groups/0", 2, 5 ]
203
+ - [ "/groups/0/name", 2, 17 ]
204
+ - [ "/groups/0/desc", 3, 17 ]
205
+ - [ "/groups/0/owner", 4, 12 ]
206
+ - [ "/groups/0/owner/name", 5, 17 ]
207
+ - [ "/groups/0/owner/desc", 6, 17 ]
208
+ - [ "/groups/1", 7, 5 ]
209
+ - [ "/groups/1/name", 7, 17 ]
210
+ - [ "/groups/1/desc", 8, 17 ]
211
+ - [ "/groups/1/owner", 9, 12 ]
212
+ - [ "/groups/1/owner/name", 10, 17 ]
213
+ - [ "/groups/1/owner/desc", 11, 17 ]
214
+ - [ "/users", 13, 3 ]
215
+ - [ "/users/0", 13, 5 ]
216
+ - [ "/users/0/name", 5, 17 ]
217
+ - [ "/users/0/desc", 6, 17 ]
218
+ - [ "/users/1", 14, 5 ]
219
+ - [ "/users/1/name", 10, 17 ]
220
+ - [ "/users/1/desc", 11, 17 ]
221
+ - [ "/users/2", 15, 5 ]
222
+ - [ "/users/2/name", 16, 11 ]
223
+ - [ "/users/3", 17, 5 ]
224
+ - [ "/users/3/name", 17, 11 ]
225
+ - [ "/users/3/manager", 18, 14 ]
226
+ - [ "/users/3/manager/name", 16, 11 ]
227
+
228
+
229
+ - name: databind3
230
+ desc: preceding alias
231
+ testopts: { preceding_alias: yes }
232
+ schema: *context_schema
233
+ classdef*: *context_classdef
234
+ data: |
235
+ groups:
236
+ - name: admin
237
+ desc: administrator group
238
+ owner: *root
239
+ - name: users
240
+ desc: user group
241
+ owner: *guest
242
+ users:
243
+ - &root
244
+ name: root
245
+ desc: root user
246
+ - &guest
247
+ name: guest
248
+ desc: guest user
249
+ - name: user2
250
+ manager: *user1
251
+ - &user1
252
+ name: user1
253
+
254
+ expected*:
255
+ ruby: |
256
+ #<My2::Context:0x001
257
+ @groups=
258
+ [#<My2::Group:0x002
259
+ @desc="administrator group",
260
+ @name="admin",
261
+ @owner=#<My2::User:0x003 @desc="root user", @name="root">>,
262
+ #<My2::Group:0x004
263
+ @desc="user group",
264
+ @name="users",
265
+ @owner=#<My2::User:0x005 @desc="guest user", @name="guest">>],
266
+ @users=
267
+ [#<My2::User:0x003 @desc="root user", @name="root">,
268
+ #<My2::User:0x005 @desc="guest user", @name="guest">,
269
+ #<My2::User:0x006
270
+ @manager=#<My2::User:0x007 @name="user1">,
271
+ @name="user2">,
272
+ #<My2::User:0x007 @name="user1">]>
273
+
274
+ locations:
275
+ - [ "/", 1, 1 ]
276
+ - [ "/groups", 2, 3 ]
277
+ - [ "/groups/0", 2, 5 ]
278
+ - [ "/groups/0/name", 2, 17 ]
279
+ - [ "/groups/0/desc", 3, 17 ]
280
+ - [ "/groups/0/owner", 4, 17 ]
281
+ - [ "/groups/0/owner/name", 10, 17 ]
282
+ - [ "/groups/0/owner/desc", 11, 17 ]
283
+ - [ "/groups/1", 5, 5 ]
284
+ - [ "/groups/1/name", 5, 17 ]
285
+ - [ "/groups/1/desc", 6, 17 ]
286
+ - [ "/groups/1/owner", 7, 17 ]
287
+ - [ "/groups/1/owner/name", 13, 17 ]
288
+ - [ "/groups/1/owner/desc", 14, 17 ]
289
+ - [ "/users", 9, 3 ]
290
+ - [ "/users/0", 9, 5 ]
291
+ - [ "/users/0/name", 10, 17 ]
292
+ - [ "/users/0/desc", 11, 17 ]
293
+ - [ "/users/1", 12, 5 ]
294
+ - [ "/users/1/name", 13, 17 ]
295
+ - [ "/users/1/desc", 14, 17 ]
296
+ - [ "/users/2", 15, 5 ]
297
+ - [ "/users/2/name", 15, 17 ]
298
+ - [ "/users/2/manager", 16, 17 ]
299
+ - [ "/users/2/manager/name", 18, 17 ]
300
+ - [ "/users/3", 17, 5 ]
301
+ - [ "/users/3/name", 18, 17 ]
302
+
303
+
304
+ - name: databind4
305
+ desc: default value
306
+ schema: |
307
+ type: map
308
+ class: Config
309
+ mapping:
310
+ "host": {type: str, default: localhost}
311
+ "port": {type: int, default: 80}
312
+ "user": {type: str, required: true}
313
+ "pass": {type: str, required: true}
314
+
315
+ classdef*:
316
+ "ruby": |
317
+ require 'kwalify/util/hashlike'
318
+ class Config
319
+ include Kwalify::Util::HashLike
320
+ def initialize
321
+ @host = 'localhost'
322
+ @port = 8080
323
+ end
324
+ attr_accessor :host, :port, :user, :pass
325
+ end
326
+ "java": |
327
+ data: |
328
+ #host: localhost
329
+ port: 8080
330
+ user: user1
331
+ pass: password1
332
+ expected*:
333
+ "ruby": |
334
+ #<Config:0x001
335
+ @host="localhost",
336
+ @pass="password1",
337
+ @port=8080,
338
+ @user="user1">
339
+ locations:
data/test/test-main.rb ADDED
@@ -0,0 +1,156 @@
1
+ ###
2
+ ### $Rev$
3
+ ### $Release: 1.4.0-preview1 $
4
+ ### copyright(c) 2005-2010 kuwata-lab all rights reserved.
5
+ ###
6
+
7
+ require File.dirname(__FILE__) + '/test.rb'
8
+
9
+ require 'kwalify/main'
10
+
11
+
12
+ module Kwalify
13
+ class Main
14
+ public :_parse_argv
15
+ end
16
+ end
17
+
18
+
19
+ class File
20
+ def self.move(filename, dirname)
21
+ File.rename(filename, "#{dirname}/#{filename}")
22
+ end
23
+ end
24
+
25
+
26
+ class MainTest < Test::Unit::TestCase
27
+
28
+ ## define test methods
29
+ filename = __FILE__.sub(/\.rb$/, ".yaml")
30
+ load_yaml_testdata(filename, :lang=>'ruby')
31
+
32
+
33
+ ## temporary directory
34
+ @@tmpdir ||= Dir.mktmpdir("tmp.dir")
35
+
36
+
37
+ def _test
38
+ if @exception
39
+ classname = @exception =~ /Kwalify::(.*)/ ? $1 : @exception
40
+ @exception_class = Kwalify.const_get(classname)
41
+ end
42
+ case @method
43
+ when 'parseOptions'
44
+ _test_parse_options()
45
+ when 'execute'
46
+ _test_execute()
47
+ when 'validation'
48
+ raise "*** #{@name}: schema is not defined." unless @schema
49
+ raise "*** #{@name}: valid is not defined." unless @valid
50
+ raise "*** #{@name}: invalid is not defined." unless @invalid
51
+ _test_validation()
52
+ #when 'action'
53
+ # _test_action()
54
+ else
55
+ raise "*** #{@method}: invalid method name."
56
+ end
57
+ end
58
+
59
+
60
+ ## validation test
61
+ def _test_validation()
62
+ return if $target && $target != @name
63
+ raise "*** schema is not defined." unless @schema
64
+ raise "*** valid is not defined." unless @valid
65
+ raise "*** invalid is not defined." unless @invalid
66
+ #
67
+ schema_filename = @name + ".schema"
68
+ valid_filename = @name + ".valid"
69
+ invalid_filename = @name + ".invalid"
70
+ #
71
+ begin
72
+ #
73
+ File.write(File.join(@@tmpdir, schema_filename), @schema)
74
+ File.write(File.join(@@tmpdir, valid_filename), @valid)
75
+ File.write(File.join(@@tmpdir, invalid_filename), @invalid)
76
+ #
77
+ $stdout = StringWriter.new
78
+ main = Kwalify::Main.new('kwalify')
79
+ args = [ "-lf", schema_filename, valid_filename ]
80
+ Dir.chdir(@@tmpdir) do
81
+ main.execute(args)
82
+ end
83
+ output = $stdout; $stdout = STDOUT
84
+ assert_text_equal(@valid_out, output)
85
+ #
86
+ $stdout = StringWriter.new
87
+ main = Kwalify::Main.new('kwalify')
88
+ args = [ "-lf", schema_filename, invalid_filename ]
89
+ Dir.chdir(@@tmpdir) do
90
+ main.execute(args)
91
+ end
92
+ output = $stdout; $stdout = STDOUT
93
+ assert_text_equal(@invalid_out, output)
94
+ end
95
+ end
96
+
97
+
98
+ ## execute test
99
+ def _test_execute()
100
+ return if $target && $target != @name
101
+ raise "*** #{@name}: args is required." unless @args
102
+ raise "*** #{@name}: expected is require." unless @expected
103
+ #
104
+ File.write(File.join(@@tmpdir, "#{@name}.schema"), @schema) if @schema
105
+ File.write(File.join(@@tmpdir, "#{@name}.document"), @document) if @document
106
+ #
107
+ begin
108
+ main = Kwalify::Main.new("kwalify")
109
+ if @exception_class
110
+ $stdout = StringWriter.new
111
+ ex = assert_raise(@exception_class) do
112
+ Dir.chdir(@@tmpdir) do
113
+ main.execute(@args)
114
+ end
115
+ end
116
+ assert_text_equal(@errormsg, ex.message) if @errormsg
117
+ $stdout = STDOUT
118
+ else
119
+ $stdout = StringWriter.new
120
+ Dir.chdir(@@tmpdir) do
121
+ main.execute(@args)
122
+ end
123
+ actual = $stdout; $stdout = STDOUT
124
+ assert_text_equal(@expected, actual)
125
+ end
126
+ end
127
+ end
128
+
129
+
130
+ ## command option test
131
+ def _test_parse_options()
132
+ return if $target && $target != @name
133
+ main = Kwalify::Main.new("kwalify")
134
+ begin
135
+ filenames = main._parse_argv(@args)
136
+ s = main._inspect()
137
+ s << "filenames:\n"
138
+ filenames.each do |filename|
139
+ s << " - #{filename}\n"
140
+ end
141
+ actual = s
142
+ assert_text_equal(@expected, actual)
143
+ rescue => ex
144
+ #klass = @exception
145
+ if @exception_class && ex.class == @exception_class
146
+ # OK
147
+ assert_equal(@error_symbol, ex.error_symbol) if ex.respond_to?(:error_symbol)
148
+ else
149
+ # NG
150
+ raise ex
151
+ end
152
+ end
153
+ end
154
+
155
+
156
+ end