puppet 3.6.2-x86-mingw32 → 3.7.0-x86-mingw32

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of puppet might be problematic. Click here for more details.

Files changed (751) hide show
  1. checksums.yaml +4 -4
  2. data/CONTRIBUTING.md +2 -3
  3. data/Gemfile +14 -10
  4. data/README.md +1 -1
  5. data/ext/build_defaults.yaml +16 -1
  6. data/ext/debian/control +3 -2
  7. data/ext/debian/puppet-common.dirs +1 -0
  8. data/ext/debian/puppet-common.postinst +8 -8
  9. data/ext/debian/puppet-common.postrm +2 -1
  10. data/ext/project_data.yaml +16 -12
  11. data/ext/rack/example-passenger-vhost.conf +2 -2
  12. data/ext/redhat/puppet.spec.erb +6 -3
  13. data/ext/windows/service/daemon.rb +47 -41
  14. data/install.rb +1 -1
  15. data/lib/puppet.rb +34 -24
  16. data/lib/puppet/application.rb +34 -1
  17. data/lib/puppet/application/agent.rb +9 -8
  18. data/lib/puppet/application/apply.rb +14 -5
  19. data/lib/puppet/application/doc.rb +4 -11
  20. data/lib/puppet/application/master.rb +19 -17
  21. data/lib/puppet/application/queue.rb +1 -1
  22. data/lib/puppet/application/resource.rb +0 -1
  23. data/lib/puppet/configurer.rb +39 -2
  24. data/lib/puppet/configurer/downloader.rb +5 -10
  25. data/lib/puppet/configurer/downloader_factory.rb +34 -0
  26. data/lib/puppet/configurer/plugin_handler.rb +11 -17
  27. data/lib/puppet/defaults.rb +244 -119
  28. data/lib/puppet/environments.rb +8 -0
  29. data/lib/puppet/external/nagios/base.rb +1 -1
  30. data/lib/puppet/external/pson/pure/generator.rb +1 -8
  31. data/lib/puppet/face/ca.rb +7 -0
  32. data/lib/puppet/face/file/download.rb +5 -2
  33. data/lib/puppet/face/file/store.rb +1 -1
  34. data/lib/puppet/face/instrumentation_data.rb +2 -1
  35. data/lib/puppet/face/instrumentation_listener.rb +2 -1
  36. data/lib/puppet/face/instrumentation_probe.rb +2 -1
  37. data/lib/puppet/face/module/build.rb +2 -2
  38. data/lib/puppet/face/module/generate.rb +20 -12
  39. data/lib/puppet/face/module/install.rb +4 -3
  40. data/lib/puppet/face/module/uninstall.rb +7 -0
  41. data/lib/puppet/face/module/upgrade.rb +11 -3
  42. data/lib/puppet/face/node/clean.rb +1 -1
  43. data/lib/puppet/face/parser.rb +99 -7
  44. data/lib/puppet/feature/base.rb +18 -12
  45. data/lib/puppet/feature/cfacter.rb +14 -0
  46. data/lib/puppet/feature/pe_license.rb +4 -0
  47. data/lib/puppet/file_bucket/dipper.rb +19 -12
  48. data/lib/puppet/file_bucket/file.rb +73 -10
  49. data/lib/puppet/file_serving/configuration/parser.rb +3 -3
  50. data/lib/puppet/file_system.rb +1 -1
  51. data/lib/puppet/file_system/file19.rb +41 -0
  52. data/lib/puppet/file_system/file19windows.rb +0 -1
  53. data/lib/puppet/file_system/uniquefile.rb +190 -0
  54. data/lib/puppet/forge.rb +34 -7
  55. data/lib/puppet/forge/errors.rb +5 -6
  56. data/lib/puppet/forge/repository.rb +14 -2
  57. data/lib/puppet/functions.rb +19 -12
  58. data/lib/puppet/functions/assert_type.rb +27 -10
  59. data/lib/puppet/functions/each.rb +111 -0
  60. data/lib/puppet/functions/epp.rb +54 -0
  61. data/lib/puppet/functions/filter.rb +113 -0
  62. data/lib/puppet/functions/inline_epp.rb +88 -0
  63. data/lib/puppet/functions/map.rb +97 -0
  64. data/lib/puppet/functions/match.rb +102 -0
  65. data/lib/puppet/functions/reduce.rb +94 -0
  66. data/lib/puppet/functions/slice.rb +126 -0
  67. data/lib/puppet/functions/with.rb +23 -0
  68. data/lib/puppet/indirector/catalog/compiler.rb +4 -4
  69. data/lib/puppet/indirector/data_binding/hiera.rb +2 -45
  70. data/lib/puppet/indirector/facts/couch.rb +3 -1
  71. data/lib/puppet/indirector/facts/facter.rb +52 -65
  72. data/lib/puppet/indirector/file_bucket_file/file.rb +6 -3
  73. data/lib/puppet/indirector/hiera.rb +48 -0
  74. data/lib/puppet/indirector/indirection.rb +1 -1
  75. data/lib/puppet/indirector/request.rb +9 -3
  76. data/lib/puppet/indirector/resource/ral.rb +1 -1
  77. data/lib/puppet/indirector/rest.rb +7 -3
  78. data/lib/puppet/loaders.rb +0 -1
  79. data/lib/puppet/module.rb +2 -1
  80. data/lib/puppet/module_tool.rb +2 -0
  81. data/lib/puppet/module_tool/applications/application.rb +4 -5
  82. data/lib/puppet/module_tool/applications/builder.rb +64 -5
  83. data/lib/puppet/module_tool/applications/uninstaller.rb +3 -2
  84. data/lib/puppet/module_tool/applications/unpacker.rb +14 -0
  85. data/lib/puppet/module_tool/applications/upgrader.rb +23 -13
  86. data/lib/puppet/module_tool/dependency.rb +12 -0
  87. data/lib/puppet/module_tool/errors/shared.rb +1 -1
  88. data/lib/puppet/module_tool/errors/upgrader.rb +20 -0
  89. data/lib/puppet/module_tool/installed_modules.rb +6 -1
  90. data/lib/puppet/module_tool/metadata.rb +53 -3
  91. data/lib/puppet/module_tool/modulefile.rb +1 -1
  92. data/lib/puppet/module_tool/skeleton/templates/generator/Gemfile +7 -0
  93. data/lib/puppet/module_tool/skeleton/templates/generator/manifests/init.pp.erb +1 -1
  94. data/lib/puppet/module_tool/skeleton/templates/generator/spec/spec_helper.rb +1 -17
  95. data/lib/puppet/module_tool/tar/mini.rb +20 -2
  96. data/lib/puppet/network/http.rb +5 -0
  97. data/lib/puppet/network/http/api/v1.rb +2 -2
  98. data/lib/puppet/network/http/api/v2/environments.rb +15 -1
  99. data/lib/puppet/network/http/connection.rb +54 -68
  100. data/lib/puppet/network/http/factory.rb +44 -0
  101. data/lib/puppet/network/http/handler.rb +12 -6
  102. data/lib/puppet/network/http/nocache_pool.rb +21 -0
  103. data/lib/puppet/network/http/pool.rb +120 -0
  104. data/lib/puppet/network/http/rack/rest.rb +3 -1
  105. data/lib/puppet/network/http/session.rb +17 -0
  106. data/lib/puppet/network/http/site.rb +39 -0
  107. data/lib/puppet/network/http/webrick/rest.rb +3 -1
  108. data/lib/puppet/network/http_pool.rb +3 -4
  109. data/lib/puppet/node.rb +19 -6
  110. data/lib/puppet/node/environment.rb +34 -8
  111. data/lib/puppet/parser/ast/collection.rb +4 -0
  112. data/lib/puppet/parser/ast/collexpr.rb +1 -1
  113. data/lib/puppet/parser/ast/node.rb +5 -0
  114. data/lib/puppet/parser/ast/pops_bridge.rb +49 -6
  115. data/lib/puppet/parser/compiler.rb +66 -38
  116. data/lib/puppet/parser/e4_parser_adapter.rb +2 -2
  117. data/lib/puppet/parser/files.rb +76 -33
  118. data/lib/puppet/parser/functions.rb +1 -7
  119. data/lib/puppet/parser/functions/assert_type.rb +31 -0
  120. data/lib/puppet/parser/functions/contain.rb +15 -5
  121. data/lib/puppet/parser/functions/create_resources.rb +5 -1
  122. data/lib/puppet/parser/functions/digest.rb +5 -0
  123. data/lib/puppet/parser/functions/each.rb +46 -107
  124. data/lib/puppet/parser/functions/epp.rb +13 -9
  125. data/lib/puppet/parser/functions/file.rb +20 -12
  126. data/lib/puppet/parser/functions/filter.rb +32 -88
  127. data/lib/puppet/parser/functions/include.rb +12 -24
  128. data/lib/puppet/parser/functions/inline_epp.rb +9 -12
  129. data/lib/puppet/parser/functions/lookup.rb +1 -1
  130. data/lib/puppet/parser/functions/map.rb +30 -83
  131. data/lib/puppet/parser/functions/match.rb +28 -0
  132. data/lib/puppet/parser/functions/reduce.rb +69 -98
  133. data/lib/puppet/parser/functions/require.rb +13 -5
  134. data/lib/puppet/parser/functions/search.rb +6 -1
  135. data/lib/puppet/parser/functions/slice.rb +35 -103
  136. data/lib/puppet/parser/functions/template.rb +12 -5
  137. data/lib/puppet/parser/functions/with.rb +21 -0
  138. data/lib/puppet/parser/lexer.rb +1 -1
  139. data/lib/puppet/parser/parser_factory.rb +21 -33
  140. data/lib/puppet/parser/resource.rb +2 -3
  141. data/lib/puppet/parser/scope.rb +85 -15
  142. data/lib/puppet/pops.rb +9 -11
  143. data/lib/puppet/pops/adapters.rb +2 -1
  144. data/lib/puppet/pops/binder/bindings_checker.rb +4 -4
  145. data/lib/puppet/pops/binder/bindings_factory.rb +6 -6
  146. data/lib/puppet/pops/binder/bindings_label_provider.rb +1 -1
  147. data/lib/puppet/pops/binder/bindings_loader.rb +2 -2
  148. data/lib/puppet/pops/binder/bindings_model.rb +58 -191
  149. data/lib/puppet/pops/binder/bindings_model_dumper.rb +1 -1
  150. data/lib/puppet/pops/binder/bindings_model_meta.rb +215 -0
  151. data/lib/puppet/pops/binder/injector.rb +9 -9
  152. data/lib/puppet/pops/binder/key_factory.rb +2 -2
  153. data/lib/puppet/pops/binder/lookup.rb +14 -6
  154. data/lib/puppet/pops/binder/producers.rb +9 -12
  155. data/lib/puppet/pops/evaluator/access_operator.rb +35 -29
  156. data/lib/puppet/pops/evaluator/callable_mismatch_describer.rb +175 -0
  157. data/lib/puppet/pops/evaluator/callable_signature.rb +1 -2
  158. data/lib/puppet/pops/evaluator/closure.rb +151 -35
  159. data/lib/puppet/pops/evaluator/compare_operator.rb +26 -22
  160. data/lib/puppet/pops/evaluator/epp_evaluator.rb +16 -15
  161. data/lib/puppet/pops/evaluator/evaluator_impl.rb +277 -229
  162. data/lib/puppet/pops/evaluator/relationship_operator.rb +3 -2
  163. data/lib/puppet/pops/evaluator/runtime3_support.rb +86 -53
  164. data/lib/puppet/pops/functions/dispatch.rb +9 -4
  165. data/lib/puppet/pops/functions/dispatcher.rb +2 -169
  166. data/lib/puppet/pops/issue_reporter.rb +14 -6
  167. data/lib/puppet/pops/issues.rb +96 -21
  168. data/lib/puppet/pops/loader/base_loader.rb +3 -3
  169. data/lib/puppet/pops/loader/loader.rb +1 -1
  170. data/lib/puppet/pops/loader/loader_paths.rb +2 -21
  171. data/lib/puppet/pops/loader/ruby_function_instantiator.rb +1 -1
  172. data/lib/puppet/pops/loader/static_loader.rb +12 -2
  173. data/lib/puppet/pops/model/ast_transformer.rb +4 -24
  174. data/lib/puppet/pops/model/factory.rb +72 -10
  175. data/lib/puppet/pops/model/model.rb +82 -574
  176. data/lib/puppet/pops/model/model_label_provider.rb +4 -2
  177. data/lib/puppet/pops/model/model_meta.rb +576 -0
  178. data/lib/puppet/pops/model/model_tree_dumper.rb +27 -5
  179. data/lib/puppet/pops/parser/egrammar.ra +209 -221
  180. data/lib/puppet/pops/parser/eparser.rb +1459 -1431
  181. data/lib/puppet/pops/parser/evaluating_parser.rb +15 -75
  182. data/lib/puppet/pops/parser/lexer2.rb +14 -10
  183. data/lib/puppet/pops/parser/lexer_support.rb +6 -0
  184. data/lib/puppet/pops/parser/locator.rb +1 -1
  185. data/lib/puppet/pops/parser/parser_support.rb +31 -49
  186. data/lib/puppet/pops/patterns.rb +10 -10
  187. data/lib/puppet/pops/semantic_error.rb +1 -1
  188. data/lib/puppet/pops/types/class_loader.rb +24 -13
  189. data/lib/puppet/pops/types/type_calculator.rb +188 -87
  190. data/lib/puppet/pops/types/type_factory.rb +79 -53
  191. data/lib/puppet/pops/types/type_parser.rb +22 -16
  192. data/lib/puppet/pops/types/types.rb +283 -392
  193. data/lib/puppet/pops/types/types_meta.rb +223 -0
  194. data/lib/puppet/pops/utils.rb +16 -14
  195. data/lib/puppet/pops/validation/checker4_0.rb +264 -18
  196. data/lib/puppet/pops/validation/validator_factory_4_0.rb +0 -1
  197. data/lib/puppet/pops/visitor.rb +0 -103
  198. data/lib/puppet/provider/exec.rb +10 -1
  199. data/lib/puppet/provider/file/windows.rb +3 -4
  200. data/lib/puppet/provider/group/windows_adsi.rb +10 -10
  201. data/lib/puppet/provider/nameservice/directoryservice.rb +3 -4
  202. data/lib/puppet/provider/package/apt.rb +5 -1
  203. data/lib/puppet/provider/package/gem.rb +7 -3
  204. data/lib/puppet/provider/package/openbsd.rb +84 -7
  205. data/lib/puppet/provider/package/pacman.rb +29 -4
  206. data/lib/puppet/provider/package/rpm.rb +5 -7
  207. data/lib/puppet/provider/package/sun.rb +5 -1
  208. data/lib/puppet/provider/package/windows.rb +6 -1
  209. data/lib/puppet/provider/package/windows/exe_package.rb +1 -1
  210. data/lib/puppet/provider/package/windows/msi_package.rb +1 -1
  211. data/lib/puppet/provider/package/windows/package.rb +13 -1
  212. data/lib/puppet/provider/package/yum.rb +7 -3
  213. data/lib/puppet/provider/package/zypper.rb +5 -1
  214. data/lib/puppet/provider/parsedfile.rb +17 -1
  215. data/lib/puppet/provider/scheduled_task/win32_taskscheduler.rb +6 -12
  216. data/lib/puppet/provider/service/freebsd.rb +12 -12
  217. data/lib/puppet/provider/service/init.rb +5 -0
  218. data/lib/puppet/provider/service/launchd.rb +0 -3
  219. data/lib/puppet/provider/service/openbsd.rb +8 -7
  220. data/lib/puppet/provider/ssh_authorized_key/parsed.rb +2 -2
  221. data/lib/puppet/provider/sshkey/parsed.rb +5 -0
  222. data/lib/puppet/provider/user/user_role_add.rb +5 -4
  223. data/lib/puppet/provider/user/windows_adsi.rb +8 -8
  224. data/lib/puppet/provider/zone/solaris.rb +1 -1
  225. data/lib/puppet/reference/metaparameter.rb +8 -6
  226. data/lib/puppet/reports/store.rb +4 -9
  227. data/lib/puppet/resource.rb +75 -11
  228. data/lib/puppet/resource/catalog.rb +9 -7
  229. data/lib/puppet/resource/type.rb +27 -0
  230. data/lib/puppet/settings.rb +61 -41
  231. data/lib/puppet/settings/base_setting.rb +9 -3
  232. data/lib/puppet/settings/environment_conf.rb +32 -4
  233. data/lib/puppet/settings/file_setting.rb +9 -1
  234. data/lib/puppet/settings/priority_setting.rb +5 -5
  235. data/lib/puppet/ssl.rb +1 -0
  236. data/lib/puppet/ssl/certificate_authority.rb +15 -6
  237. data/lib/puppet/ssl/certificate_authority/autosign_command.rb +2 -1
  238. data/lib/puppet/ssl/host.rb +3 -2
  239. data/lib/puppet/ssl/inventory.rb +11 -6
  240. data/lib/puppet/ssl/validator/default_validator.rb +1 -0
  241. data/lib/puppet/ssl/validator/no_validator.rb +3 -0
  242. data/lib/puppet/transaction.rb +29 -0
  243. data/lib/puppet/transaction/resource_harness.rb +16 -3
  244. data/lib/puppet/type.rb +71 -49
  245. data/lib/puppet/type/exec.rb +36 -8
  246. data/lib/puppet/type/file.rb +56 -16
  247. data/lib/puppet/type/file/content.rb +3 -3
  248. data/lib/puppet/type/file/mode.rb +12 -3
  249. data/lib/puppet/type/file/source.rb +4 -1
  250. data/lib/puppet/type/group.rb +1 -1
  251. data/lib/puppet/type/mount.rb +1 -3
  252. data/lib/puppet/type/resources.rb +59 -35
  253. data/lib/puppet/type/ssh_authorized_key.rb +54 -16
  254. data/lib/puppet/type/sshkey.rb +1 -1
  255. data/lib/puppet/type/user.rb +17 -11
  256. data/lib/puppet/type/yumrepo.rb +59 -8
  257. data/lib/puppet/type/zone.rb +3 -6
  258. data/lib/puppet/util.rb +64 -55
  259. data/lib/puppet/util/autoload.rb +2 -2
  260. data/lib/puppet/util/colors.rb +61 -19
  261. data/lib/puppet/util/command_line.rb +21 -4
  262. data/lib/puppet/util/execution.rb +41 -29
  263. data/lib/puppet/util/feature.rb +15 -4
  264. data/lib/puppet/util/filetype.rb +6 -2
  265. data/lib/puppet/util/http_proxy.rb +29 -2
  266. data/lib/puppet/util/lockfile.rb +1 -1
  267. data/lib/puppet/util/log/destinations.rb +7 -3
  268. data/lib/puppet/util/logging.rb +44 -14
  269. data/lib/puppet/util/pidlock.rb +11 -5
  270. data/lib/puppet/util/posix.rb +21 -31
  271. data/lib/puppet/util/profiler.rb +17 -9
  272. data/lib/puppet/util/profiler/aggregate.rb +85 -0
  273. data/lib/puppet/util/profiler/around_profiler.rb +67 -0
  274. data/lib/puppet/util/profiler/logging.rb +12 -11
  275. data/lib/puppet/util/profiler/wall_clock.rb +7 -6
  276. data/lib/puppet/util/rdoc.rb +8 -1
  277. data/lib/puppet/util/rdoc/parser/puppet_parser_core.rb +1 -1
  278. data/lib/puppet/util/suidmanager.rb +1 -8
  279. data/lib/puppet/util/windows.rb +14 -3
  280. data/lib/puppet/util/windows/access_control_list.rb +4 -4
  281. data/lib/puppet/util/{adsi.rb → windows/adsi.rb} +99 -37
  282. data/lib/puppet/util/windows/api_types.rb +255 -0
  283. data/lib/puppet/util/windows/com.rb +224 -0
  284. data/lib/puppet/util/windows/error.rb +72 -5
  285. data/lib/puppet/util/windows/file.rb +254 -132
  286. data/lib/puppet/util/windows/process.rb +293 -177
  287. data/lib/puppet/util/windows/registry.rb +12 -2
  288. data/lib/puppet/util/windows/root_certs.rb +16 -9
  289. data/lib/puppet/util/windows/security.rb +501 -232
  290. data/lib/puppet/util/windows/sid.rb +80 -36
  291. data/lib/puppet/util/windows/string.rb +2 -0
  292. data/lib/puppet/util/windows/taskscheduler.rb +1241 -0
  293. data/lib/puppet/util/windows/user.rb +241 -57
  294. data/lib/puppet/vendor.rb +3 -1
  295. data/lib/puppet/vendor/load_pathspec.rb +1 -0
  296. data/lib/puppet/vendor/load_rgen.rb +1 -0
  297. data/lib/puppet/vendor/pathspec/CHANGELOG.md +2 -0
  298. data/lib/puppet/vendor/pathspec/LICENSE +201 -0
  299. data/lib/puppet/vendor/pathspec/PUPPET_README.md +6 -0
  300. data/lib/puppet/vendor/pathspec/README.md +53 -0
  301. data/lib/puppet/vendor/pathspec/lib/pathspec.rb +121 -0
  302. data/lib/puppet/vendor/pathspec/lib/pathspec/gitignorespec.rb +275 -0
  303. data/lib/puppet/vendor/pathspec/lib/pathspec/regexspec.rb +17 -0
  304. data/lib/puppet/vendor/pathspec/lib/pathspec/spec.rb +14 -0
  305. data/lib/puppet/vendor/require_vendored.rb +2 -0
  306. data/lib/puppet/vendor/rgen/CHANGELOG +197 -0
  307. data/lib/puppet/vendor/rgen/MIT-LICENSE +20 -0
  308. data/lib/puppet/vendor/rgen/PUPPET_README.md +6 -0
  309. data/lib/puppet/vendor/rgen/README.rdoc +78 -0
  310. data/lib/puppet/vendor/rgen/Rakefile +41 -0
  311. data/lib/puppet/vendor/rgen/TODO +41 -0
  312. data/lib/puppet/vendor/rgen/anounce.txt +61 -0
  313. data/lib/puppet/vendor/rgen/design_rationale.txt +71 -0
  314. data/lib/puppet/vendor/rgen/lib/ea_support/ea_support.rb +54 -0
  315. data/lib/puppet/vendor/rgen/lib/ea_support/id_store.rb +32 -0
  316. data/lib/puppet/vendor/rgen/lib/ea_support/uml13_ea_metamodel.rb +562 -0
  317. data/lib/puppet/vendor/rgen/lib/ea_support/uml13_ea_metamodel_ext.rb +45 -0
  318. data/lib/puppet/vendor/rgen/lib/ea_support/uml13_ea_metamodel_generator.rb +43 -0
  319. data/lib/puppet/vendor/rgen/lib/ea_support/uml13_ea_to_uml13.rb +103 -0
  320. data/lib/puppet/vendor/rgen/lib/ea_support/uml13_to_uml13_ea.rb +89 -0
  321. data/lib/puppet/vendor/rgen/lib/metamodels/uml13_metamodel.rb +559 -0
  322. data/lib/puppet/vendor/rgen/lib/metamodels/uml13_metamodel_ext.rb +26 -0
  323. data/lib/puppet/vendor/rgen/lib/mmgen/metamodel_generator.rb +20 -0
  324. data/lib/puppet/vendor/rgen/lib/mmgen/mm_ext/ecore_mmgen_ext.rb +91 -0
  325. data/lib/puppet/vendor/rgen/lib/mmgen/mmgen.rb +28 -0
  326. data/lib/puppet/vendor/rgen/lib/mmgen/templates/annotations.tpl +37 -0
  327. data/lib/puppet/vendor/rgen/lib/mmgen/templates/metamodel_generator.tpl +172 -0
  328. data/lib/puppet/vendor/rgen/lib/rgen/array_extensions.rb +45 -0
  329. data/lib/puppet/vendor/rgen/lib/rgen/ecore/ecore.rb +218 -0
  330. data/lib/puppet/vendor/rgen/lib/rgen/ecore/ecore_builder_methods.rb +81 -0
  331. data/lib/puppet/vendor/rgen/lib/rgen/ecore/ecore_ext.rb +69 -0
  332. data/lib/puppet/vendor/rgen/lib/rgen/ecore/ecore_interface.rb +47 -0
  333. data/lib/puppet/vendor/rgen/lib/rgen/ecore/ecore_to_ruby.rb +167 -0
  334. data/lib/puppet/vendor/rgen/lib/rgen/ecore/ruby_to_ecore.rb +91 -0
  335. data/lib/puppet/vendor/rgen/lib/rgen/environment.rb +129 -0
  336. data/lib/puppet/vendor/rgen/lib/rgen/fragment/dump_file_cache.rb +63 -0
  337. data/lib/puppet/vendor/rgen/lib/rgen/fragment/fragmented_model.rb +140 -0
  338. data/lib/puppet/vendor/rgen/lib/rgen/fragment/model_fragment.rb +289 -0
  339. data/lib/puppet/vendor/rgen/lib/rgen/instantiator/abstract_instantiator.rb +66 -0
  340. data/lib/puppet/vendor/rgen/lib/rgen/instantiator/abstract_xml_instantiator.rb +66 -0
  341. data/lib/puppet/vendor/rgen/lib/rgen/instantiator/default_xml_instantiator.rb +117 -0
  342. data/lib/puppet/vendor/rgen/lib/rgen/instantiator/ecore_xml_instantiator.rb +169 -0
  343. data/lib/puppet/vendor/rgen/lib/rgen/instantiator/json_instantiator.rb +126 -0
  344. data/lib/puppet/vendor/rgen/lib/rgen/instantiator/json_parser.rb +331 -0
  345. data/lib/puppet/vendor/rgen/lib/rgen/instantiator/json_parser.y +94 -0
  346. data/lib/puppet/vendor/rgen/lib/rgen/instantiator/nodebased_xml_instantiator.rb +137 -0
  347. data/lib/puppet/vendor/rgen/lib/rgen/instantiator/qualified_name_resolver.rb +97 -0
  348. data/lib/puppet/vendor/rgen/lib/rgen/instantiator/reference_resolver.rb +128 -0
  349. data/lib/puppet/vendor/rgen/lib/rgen/instantiator/resolution_helper.rb +47 -0
  350. data/lib/puppet/vendor/rgen/lib/rgen/instantiator/xmi11_instantiator.rb +168 -0
  351. data/lib/puppet/vendor/rgen/lib/rgen/metamodel_builder.rb +224 -0
  352. data/lib/puppet/vendor/rgen/lib/rgen/metamodel_builder/builder_extensions.rb +556 -0
  353. data/lib/puppet/vendor/rgen/lib/rgen/metamodel_builder/builder_runtime.rb +174 -0
  354. data/lib/puppet/vendor/rgen/lib/rgen/metamodel_builder/constant_order_helper.rb +89 -0
  355. data/lib/puppet/vendor/rgen/lib/rgen/metamodel_builder/data_types.rb +77 -0
  356. data/lib/puppet/vendor/rgen/lib/rgen/metamodel_builder/intermediate/annotation.rb +30 -0
  357. data/lib/puppet/vendor/rgen/lib/rgen/metamodel_builder/intermediate/feature.rb +168 -0
  358. data/lib/puppet/vendor/rgen/lib/rgen/metamodel_builder/mm_multiple.rb +23 -0
  359. data/lib/puppet/vendor/rgen/lib/rgen/metamodel_builder/module_extension.rb +42 -0
  360. data/lib/puppet/vendor/rgen/lib/rgen/model_builder.rb +32 -0
  361. data/lib/puppet/vendor/rgen/lib/rgen/model_builder/builder_context.rb +334 -0
  362. data/lib/puppet/vendor/rgen/lib/rgen/model_builder/model_serializer.rb +225 -0
  363. data/lib/puppet/vendor/rgen/lib/rgen/model_builder/reference_resolver.rb +156 -0
  364. data/lib/puppet/vendor/rgen/lib/rgen/serializer/json_serializer.rb +121 -0
  365. data/lib/puppet/vendor/rgen/lib/rgen/serializer/opposite_reference_filter.rb +18 -0
  366. data/lib/puppet/vendor/rgen/lib/rgen/serializer/qualified_name_provider.rb +47 -0
  367. data/lib/puppet/vendor/rgen/lib/rgen/serializer/xmi11_serializer.rb +116 -0
  368. data/lib/puppet/vendor/rgen/lib/rgen/serializer/xmi20_serializer.rb +71 -0
  369. data/lib/puppet/vendor/rgen/lib/rgen/serializer/xml_serializer.rb +98 -0
  370. data/lib/puppet/vendor/rgen/lib/rgen/template_language.rb +297 -0
  371. data/lib/puppet/vendor/rgen/lib/rgen/template_language/directory_template_container.rb +83 -0
  372. data/lib/puppet/vendor/rgen/lib/rgen/template_language/output_handler.rb +87 -0
  373. data/lib/puppet/vendor/rgen/lib/rgen/template_language/template_container.rb +234 -0
  374. data/lib/puppet/vendor/rgen/lib/rgen/template_language/template_helper.rb +26 -0
  375. data/lib/puppet/vendor/rgen/lib/rgen/transformer.rb +475 -0
  376. data/lib/puppet/vendor/rgen/lib/rgen/util/auto_class_creator.rb +61 -0
  377. data/lib/puppet/vendor/rgen/lib/rgen/util/cached_glob.rb +67 -0
  378. data/lib/puppet/vendor/rgen/lib/rgen/util/file_cache_map.rb +124 -0
  379. data/lib/puppet/vendor/rgen/lib/rgen/util/file_change_detector.rb +84 -0
  380. data/lib/puppet/vendor/rgen/lib/rgen/util/method_delegation.rb +114 -0
  381. data/lib/puppet/vendor/rgen/lib/rgen/util/model_comparator.rb +68 -0
  382. data/lib/puppet/vendor/rgen/lib/rgen/util/model_comparator_base.rb +142 -0
  383. data/lib/puppet/vendor/rgen/lib/rgen/util/model_dumper.rb +29 -0
  384. data/lib/puppet/vendor/rgen/lib/rgen/util/name_helper.rb +42 -0
  385. data/lib/puppet/vendor/rgen/lib/rgen/util/pattern_matcher.rb +329 -0
  386. data/lib/puppet/vendor/rgen/lib/transformers/ecore_to_uml13.rb +79 -0
  387. data/lib/puppet/vendor/rgen/lib/transformers/uml13_to_ecore.rb +127 -0
  388. data/lib/puppet/vendor/rgen/test/array_extensions_test.rb +64 -0
  389. data/lib/puppet/vendor/rgen/test/ea_instantiator_test.rb +35 -0
  390. data/lib/puppet/vendor/rgen/test/ea_serializer_test.rb +23 -0
  391. data/lib/puppet/vendor/rgen/test/ecore_self_test.rb +54 -0
  392. data/lib/puppet/vendor/rgen/test/environment_test.rb +90 -0
  393. data/lib/puppet/vendor/rgen/test/json_test.rb +171 -0
  394. data/lib/puppet/vendor/rgen/test/metamodel_builder_test.rb +1482 -0
  395. data/lib/puppet/vendor/rgen/test/metamodel_from_ecore_test.rb +57 -0
  396. data/lib/puppet/vendor/rgen/test/metamodel_order_test.rb +131 -0
  397. data/lib/puppet/vendor/rgen/test/metamodel_roundtrip_test.rb +98 -0
  398. data/lib/puppet/vendor/rgen/test/metamodel_roundtrip_test/TestModel.rb +70 -0
  399. data/lib/puppet/vendor/rgen/test/metamodel_roundtrip_test/houseMetamodel.ecore +42 -0
  400. data/lib/puppet/vendor/rgen/test/metamodel_roundtrip_test/houseMetamodel_from_ecore.rb +44 -0
  401. data/lib/puppet/vendor/rgen/test/metamodel_roundtrip_test/using_builtin_types.ecore +9 -0
  402. data/lib/puppet/vendor/rgen/test/method_delegation_test.rb +178 -0
  403. data/lib/puppet/vendor/rgen/test/model_builder/builder_context_test.rb +59 -0
  404. data/lib/puppet/vendor/rgen/test/model_builder/builder_test.rb +242 -0
  405. data/lib/puppet/vendor/rgen/test/model_builder/ecore_original.rb +163 -0
  406. data/lib/puppet/vendor/rgen/test/model_builder/ecore_original_regenerated.rb +163 -0
  407. data/lib/puppet/vendor/rgen/test/model_builder/reference_resolver_test.rb +156 -0
  408. data/lib/puppet/vendor/rgen/test/model_builder/serializer_test.rb +94 -0
  409. data/lib/puppet/vendor/rgen/test/model_builder/statemachine_metamodel.rb +42 -0
  410. data/lib/puppet/vendor/rgen/test/model_builder/test_model/statemachine1.rb +23 -0
  411. data/lib/puppet/vendor/rgen/test/model_builder_test.rb +6 -0
  412. data/lib/puppet/vendor/rgen/test/model_fragment_test.rb +30 -0
  413. data/lib/puppet/vendor/rgen/test/output_handler_test.rb +58 -0
  414. data/lib/puppet/vendor/rgen/test/qualified_name_provider_test.rb +48 -0
  415. data/lib/puppet/vendor/rgen/test/qualified_name_resolver_test.rb +102 -0
  416. data/lib/puppet/vendor/rgen/test/reference_resolver_test.rb +117 -0
  417. data/lib/puppet/vendor/rgen/test/rgen_test.rb +26 -0
  418. data/lib/puppet/vendor/rgen/test/template_language_test.rb +163 -0
  419. data/lib/puppet/vendor/rgen/test/template_language_test/expected_result1.txt +29 -0
  420. data/lib/puppet/vendor/rgen/test/template_language_test/expected_result2.txt +9 -0
  421. data/lib/puppet/vendor/rgen/test/template_language_test/expected_result3.txt +4 -0
  422. data/lib/puppet/vendor/rgen/test/template_language_test/indentStringTestDefaultIndent.out +1 -0
  423. data/lib/puppet/vendor/rgen/test/template_language_test/indentStringTestTabIndent.out +1 -0
  424. data/lib/puppet/vendor/rgen/test/template_language_test/templates/callback_indent_test/a.tpl +12 -0
  425. data/lib/puppet/vendor/rgen/test/template_language_test/templates/callback_indent_test/b.tpl +5 -0
  426. data/lib/puppet/vendor/rgen/test/template_language_test/templates/code/array.tpl +11 -0
  427. data/lib/puppet/vendor/rgen/test/template_language_test/templates/content/author.tpl +7 -0
  428. data/lib/puppet/vendor/rgen/test/template_language_test/templates/content/chapter.tpl +5 -0
  429. data/lib/puppet/vendor/rgen/test/template_language_test/templates/define_local_test/local.tpl +8 -0
  430. data/lib/puppet/vendor/rgen/test/template_language_test/templates/define_local_test/test.tpl +8 -0
  431. data/lib/puppet/vendor/rgen/test/template_language_test/templates/evaluate_test/test.tpl +7 -0
  432. data/lib/puppet/vendor/rgen/test/template_language_test/templates/indent_string_test.tpl +12 -0
  433. data/lib/puppet/vendor/rgen/test/template_language_test/templates/index/c/cmod.tpl +1 -0
  434. data/lib/puppet/vendor/rgen/test/template_language_test/templates/index/chapter.tpl +3 -0
  435. data/lib/puppet/vendor/rgen/test/template_language_test/templates/no_backslash_r_test.tpl +5 -0
  436. data/lib/puppet/vendor/rgen/test/template_language_test/templates/no_indent_test/no_indent.tpl +3 -0
  437. data/lib/puppet/vendor/rgen/test/template_language_test/templates/no_indent_test/sub1/no_indent.tpl +3 -0
  438. data/lib/puppet/vendor/rgen/test/template_language_test/templates/no_indent_test/test.tpl +24 -0
  439. data/lib/puppet/vendor/rgen/test/template_language_test/templates/no_indent_test/test2.tpl +13 -0
  440. data/lib/puppet/vendor/rgen/test/template_language_test/templates/no_indent_test/test3.tpl +10 -0
  441. data/lib/puppet/vendor/rgen/test/template_language_test/templates/null_context_test.tpl +17 -0
  442. data/lib/puppet/vendor/rgen/test/template_language_test/templates/root.tpl +31 -0
  443. data/lib/puppet/vendor/rgen/test/template_language_test/templates/template_resolution_test/sub1.tpl +9 -0
  444. data/lib/puppet/vendor/rgen/test/template_language_test/templates/template_resolution_test/sub1/sub1.tpl +3 -0
  445. data/lib/puppet/vendor/rgen/test/template_language_test/templates/template_resolution_test/test.tpl +4 -0
  446. data/lib/puppet/vendor/rgen/test/template_language_test/testout.txt +29 -0
  447. data/lib/puppet/vendor/rgen/test/testmodel/class_model_checker.rb +119 -0
  448. data/lib/puppet/vendor/rgen/test/testmodel/ea_testmodel.eap +0 -0
  449. data/lib/puppet/vendor/rgen/test/testmodel/ea_testmodel.xml +1029 -0
  450. data/lib/puppet/vendor/rgen/test/testmodel/ea_testmodel_partial.xml +317 -0
  451. data/lib/puppet/vendor/rgen/test/testmodel/ecore_model_checker.rb +101 -0
  452. data/lib/puppet/vendor/rgen/test/testmodel/manual_testmodel.xml +22 -0
  453. data/lib/puppet/vendor/rgen/test/testmodel/object_model_checker.rb +67 -0
  454. data/lib/puppet/vendor/rgen/test/transformer_test.rb +254 -0
  455. data/lib/puppet/vendor/rgen/test/util/file_cache_map_test.rb +99 -0
  456. data/lib/puppet/vendor/rgen/test/util/pattern_matcher_test.rb +97 -0
  457. data/lib/puppet/vendor/rgen/test/util_test.rb +5 -0
  458. data/lib/puppet/vendor/rgen/test/xml_instantiator_test.rb +160 -0
  459. data/lib/puppet/vendor/rgen/test/xml_instantiator_test/simple_ecore_model_checker.rb +94 -0
  460. data/lib/puppet/vendor/rgen/test/xml_instantiator_test/simple_xmi_ecore_instantiator.rb +53 -0
  461. data/lib/puppet/vendor/rgen/test/xml_instantiator_test/simple_xmi_metamodel.rb +49 -0
  462. data/lib/puppet/vendor/rgen/test/xml_instantiator_test/simple_xmi_to_ecore.rb +75 -0
  463. data/lib/puppet/vendor/safe_yaml/PUPPET_README.md +6 -0
  464. data/lib/puppet/vendor/semantic/PUPPET_README.md +6 -0
  465. data/lib/puppet/version.rb +1 -1
  466. data/spec/fixtures/integration/node/environment/sitedir2/00_a.pp +2 -0
  467. data/spec/fixtures/integration/node/environment/sitedir2/02_folder/01_b.pp +6 -0
  468. data/spec/fixtures/integration/node/environment/sitedir2/03_c.pp +1 -0
  469. data/spec/fixtures/integration/node/environment/sitedir2/04_include.pp +2 -0
  470. data/spec/fixtures/releases/jamtur01-apache/manifests/vhost.pp +1 -1
  471. data/spec/fixtures/unit/indirector/hiera/global.yaml +10 -0
  472. data/spec/fixtures/unit/indirector/hiera/invalid.yaml +1 -0
  473. data/spec/fixtures/unit/parser/functions/create_resources/foo/manifests/init.pp +3 -0
  474. data/spec/fixtures/unit/parser/functions/create_resources/foo/manifests/wrongdefine.pp +3 -0
  475. data/spec/fixtures/unit/parser/lexer/argumentdefaults.pp +2 -2
  476. data/spec/fixtures/unit/parser/lexer/casestatement.pp +14 -14
  477. data/spec/fixtures/unit/parser/lexer/classheirarchy.pp +3 -3
  478. data/spec/fixtures/unit/parser/lexer/classincludes.pp +3 -3
  479. data/spec/fixtures/unit/parser/lexer/classpathtest.pp +1 -1
  480. data/spec/fixtures/unit/parser/lexer/collection_override.pp +1 -1
  481. data/spec/fixtures/unit/parser/lexer/componentrequire.pp +2 -2
  482. data/spec/fixtures/unit/parser/lexer/deepclassheirarchy.pp +5 -5
  483. data/spec/fixtures/unit/parser/lexer/defineoverrides.pp +2 -2
  484. data/spec/fixtures/unit/parser/lexer/filecreate.pp +2 -2
  485. data/spec/fixtures/unit/parser/lexer/ifexpression.pp +1 -1
  486. data/spec/fixtures/unit/parser/lexer/implicititeration.pp +4 -4
  487. data/spec/fixtures/unit/parser/lexer/multipleinstances.pp +3 -3
  488. data/spec/fixtures/unit/parser/lexer/multisubs.pp +2 -2
  489. data/spec/fixtures/unit/parser/lexer/namevartest.pp +2 -2
  490. data/spec/fixtures/unit/parser/lexer/simpledefaults.pp +1 -1
  491. data/spec/fixtures/unit/pops/parser/lexer/argumentdefaults.pp +1 -1
  492. data/spec/fixtures/unit/pops/parser/lexer/casestatement.pp +14 -14
  493. data/spec/fixtures/unit/pops/parser/lexer/classheirarchy.pp +3 -3
  494. data/spec/fixtures/unit/pops/parser/lexer/classincludes.pp +3 -3
  495. data/spec/fixtures/unit/pops/parser/lexer/classpathtest.pp +1 -1
  496. data/spec/fixtures/unit/pops/parser/lexer/collection_override.pp +1 -1
  497. data/spec/fixtures/unit/pops/parser/lexer/componentrequire.pp +2 -2
  498. data/spec/fixtures/unit/pops/parser/lexer/deepclassheirarchy.pp +5 -5
  499. data/spec/fixtures/unit/pops/parser/lexer/defineoverrides.pp +2 -2
  500. data/spec/fixtures/unit/pops/parser/lexer/filecreate.pp +2 -2
  501. data/spec/fixtures/unit/pops/parser/lexer/ifexpression.pp +1 -1
  502. data/spec/fixtures/unit/pops/parser/lexer/implicititeration.pp +4 -4
  503. data/spec/fixtures/unit/pops/parser/lexer/multipleinstances.pp +3 -3
  504. data/spec/fixtures/unit/pops/parser/lexer/multisubs.pp +2 -2
  505. data/spec/fixtures/unit/pops/parser/lexer/namevartest.pp +2 -2
  506. data/spec/fixtures/unit/pops/parser/lexer/simpledefaults.pp +1 -1
  507. data/spec/fixtures/unit/provider/package/gem/gem-list-single-package +4 -0
  508. data/spec/fixtures/unit/type/user/authorized_keys +1 -1
  509. data/spec/integration/agent/logging_spec.rb +4 -0
  510. data/spec/integration/application/doc_spec.rb +4 -3
  511. data/spec/integration/configurer_spec.rb +0 -14
  512. data/spec/integration/defaults_spec.rb +26 -0
  513. data/spec/integration/environments/default_manifest_spec.rb +274 -0
  514. data/spec/integration/faces/documentation_spec.rb +0 -4
  515. data/spec/integration/file_bucket/file_spec.rb +21 -0
  516. data/spec/integration/indirector/catalog/compiler_spec.rb +0 -2
  517. data/spec/integration/indirector/catalog/queue_spec.rb +0 -2
  518. data/spec/integration/indirector/facts/facter_spec.rb +1 -1
  519. data/spec/integration/indirector/file_content/file_server_spec.rb +2 -2
  520. data/spec/integration/node/environment_spec.rb +24 -8
  521. data/spec/integration/parser/catalog_spec.rb +10 -10
  522. data/spec/integration/parser/class_spec.rb +37 -0
  523. data/spec/integration/parser/collector_spec.rb +234 -75
  524. data/spec/integration/parser/compiler_spec.rb +385 -401
  525. data/spec/integration/parser/conditionals_spec.rb +117 -0
  526. data/spec/integration/parser/future_compiler_spec.rb +359 -8
  527. data/spec/integration/parser/node_spec.rb +185 -0
  528. data/spec/integration/parser/resource_expressions_spec.rb +286 -0
  529. data/spec/integration/parser/ruby_manifest_spec.rb +0 -4
  530. data/spec/integration/parser/scope_spec.rb +94 -151
  531. data/spec/integration/provider/cron/crontab_spec.rb +137 -148
  532. data/spec/integration/ssl/certificate_authority_spec.rb +26 -0
  533. data/spec/integration/ssl/certificate_request_spec.rb +0 -6
  534. data/spec/integration/ssl/certificate_revocation_list_spec.rb +0 -2
  535. data/spec/integration/ssl/host_spec.rb +0 -2
  536. data/spec/integration/transaction_spec.rb +16 -0
  537. data/spec/integration/type/file_spec.rb +14 -13
  538. data/spec/integration/type/nagios_spec.rb +6 -15
  539. data/spec/integration/type/sshkey_spec.rb +22 -0
  540. data/spec/integration/type/tidy_spec.rb +3 -0
  541. data/spec/integration/type/user_spec.rb +8 -3
  542. data/spec/integration/util/autoload_spec.rb +6 -6
  543. data/spec/integration/util/rdoc/parser_spec.rb +7 -0
  544. data/spec/integration/util/windows/process_spec.rb +12 -0
  545. data/spec/integration/util/windows/security_spec.rb +36 -35
  546. data/spec/integration/util/windows/user_spec.rb +75 -9
  547. data/spec/integration/util_spec.rb +2 -2
  548. data/spec/lib/matchers/resource.rb +1 -0
  549. data/spec/lib/puppet_spec/compiler.rb +15 -2
  550. data/spec/lib/puppet_spec/files.rb +10 -0
  551. data/spec/lib/puppet_spec/language.rb +74 -0
  552. data/spec/lib/puppet_spec/matchers.rb +59 -32
  553. data/spec/lib/puppet_spec/module_tool/stub_source.rb +3 -0
  554. data/spec/shared_behaviours/hiera_indirections.rb +99 -0
  555. data/spec/shared_behaviours/iterative_functions.rb +69 -0
  556. data/spec/unit/application/apply_spec.rb +4 -2
  557. data/spec/unit/application/doc_spec.rb +17 -13
  558. data/spec/unit/application/master_spec.rb +35 -27
  559. data/spec/unit/application/resource_spec.rb +0 -5
  560. data/spec/unit/configurer/downloader_factory_spec.rb +96 -0
  561. data/spec/unit/configurer/downloader_spec.rb +3 -24
  562. data/spec/unit/configurer/plugin_handler_spec.rb +22 -22
  563. data/spec/unit/configurer_spec.rb +0 -4
  564. data/spec/unit/defaults_spec.rb +30 -0
  565. data/spec/unit/face/config_spec.rb +2 -1
  566. data/spec/unit/face/module/build_spec.rb +2 -2
  567. data/spec/unit/face/module/install_spec.rb +8 -8
  568. data/spec/unit/face/parser_spec.rb +71 -33
  569. data/spec/unit/file_bucket/file_spec.rb +2 -2
  570. data/spec/unit/file_system/uniquefile_spec.rb +184 -0
  571. data/spec/unit/forge/errors_spec.rb +4 -6
  572. data/spec/unit/forge/module_release_spec.rb +178 -89
  573. data/spec/unit/forge/repository_spec.rb +110 -2
  574. data/spec/unit/forge_spec.rb +39 -3
  575. data/spec/unit/functions/assert_type_spec.rb +22 -3
  576. data/spec/unit/{parser/methods → functions}/each_spec.rb +21 -1
  577. data/spec/unit/{parser/functions → functions}/epp_spec.rb +61 -9
  578. data/spec/unit/{parser/methods → functions}/filter_spec.rb +34 -38
  579. data/spec/unit/{parser/functions → functions}/inline_epp_spec.rb +18 -3
  580. data/spec/unit/functions/map_spec.rb +169 -0
  581. data/spec/unit/functions/match_spec.rb +57 -0
  582. data/spec/unit/{parser/methods → functions}/reduce_spec.rb +23 -5
  583. data/spec/unit/{parser/methods → functions}/slice_spec.rb +34 -21
  584. data/spec/unit/functions/with_spec.rb +35 -0
  585. data/spec/unit/functions4_spec.rb +7 -8
  586. data/spec/unit/indirector/catalog/compiler_spec.rb +0 -2
  587. data/spec/unit/indirector/catalog/static_compiler_spec.rb +11 -0
  588. data/spec/unit/indirector/data_binding/hiera_spec.rb +1 -96
  589. data/spec/unit/indirector/facts/facter_spec.rb +69 -102
  590. data/spec/unit/indirector/hiera_spec.rb +17 -0
  591. data/spec/unit/indirector/request_spec.rb +2 -4
  592. data/spec/unit/indirector/resource/ral_spec.rb +5 -0
  593. data/spec/unit/indirector/resource_type/parser_spec.rb +17 -12
  594. data/spec/unit/indirector/rest_spec.rb +36 -6
  595. data/spec/unit/interface/face_collection_spec.rb +2 -2
  596. data/spec/unit/module_tool/applications/builder_spec.rb +364 -14
  597. data/spec/unit/module_tool/applications/uninstaller_spec.rb +22 -0
  598. data/spec/unit/module_tool/applications/unpacker_spec.rb +40 -0
  599. data/spec/unit/module_tool/applications/upgrader_spec.rb +22 -0
  600. data/spec/unit/module_tool/installed_modules_spec.rb +49 -0
  601. data/spec/unit/module_tool/metadata_spec.rb +72 -4
  602. data/spec/unit/module_tool/tar/mini_spec.rb +2 -1
  603. data/spec/unit/network/authentication_spec.rb +4 -0
  604. data/spec/unit/network/http/api/v2/environments_spec.rb +24 -3
  605. data/spec/unit/network/http/connection_spec.rb +127 -92
  606. data/spec/unit/network/http/factory_spec.rb +82 -0
  607. data/spec/unit/network/http/handler_spec.rb +23 -13
  608. data/spec/unit/network/http/nocache_pool_spec.rb +43 -0
  609. data/spec/unit/network/http/pool_spec.rb +269 -0
  610. data/spec/unit/network/http/rack/rest_spec.rb +1 -1
  611. data/spec/unit/network/http/session_spec.rb +43 -0
  612. data/spec/unit/network/http/site_spec.rb +90 -0
  613. data/spec/unit/network/http/webrick_spec.rb +1 -1
  614. data/spec/unit/network/http_pool_spec.rb +9 -6
  615. data/spec/unit/network/http_spec.rb +10 -0
  616. data/spec/unit/node/environment_spec.rb +54 -0
  617. data/spec/unit/node_spec.rb +3 -5
  618. data/spec/unit/parser/compiler_spec.rb +9 -2
  619. data/spec/unit/parser/files_spec.rb +19 -0
  620. data/spec/unit/parser/functions/contain_spec.rb +51 -0
  621. data/spec/unit/parser/functions/create_resources_spec.rb +8 -1
  622. data/spec/unit/parser/functions/digest_spec.rb +31 -0
  623. data/spec/unit/parser/functions/file_spec.rb +48 -5
  624. data/spec/unit/parser/functions/include_spec.rb +15 -1
  625. data/spec/unit/parser/functions/realize_spec.rb +43 -35
  626. data/spec/unit/parser/functions/require_spec.rb +19 -5
  627. data/spec/unit/parser/functions/search_spec.rb +5 -0
  628. data/spec/unit/parser/functions/shared.rb +82 -0
  629. data/spec/unit/parser/functions_spec.rb +1 -1
  630. data/spec/unit/parser/lexer_spec.rb +10 -1
  631. data/spec/unit/parser/type_loader_spec.rb +0 -1
  632. data/spec/unit/pops/benchmark_spec.rb +1 -1
  633. data/spec/unit/pops/binder/bindings_composer_spec.rb +24 -22
  634. data/spec/unit/pops/binder/injector_spec.rb +8 -6
  635. data/spec/unit/pops/evaluator/access_ops_spec.rb +3 -3
  636. data/spec/unit/pops/evaluator/comparison_ops_spec.rb +7 -4
  637. data/spec/unit/pops/evaluator/evaluating_parser_spec.rb +250 -30
  638. data/spec/unit/pops/evaluator/logical_ops_spec.rb +2 -2
  639. data/spec/unit/pops/evaluator/variables_spec.rb +0 -105
  640. data/spec/unit/pops/issues_spec.rb +170 -0
  641. data/spec/unit/pops/loaders/dependency_loader_spec.rb +17 -0
  642. data/spec/unit/pops/loaders/loader_paths_spec.rb +4 -15
  643. data/spec/unit/pops/loaders/loaders_spec.rb +31 -11
  644. data/spec/unit/pops/loaders/module_loaders_spec.rb +0 -29
  645. data/spec/unit/pops/loaders/static_loader_spec.rb +6 -0
  646. data/spec/unit/pops/parser/epp_parser_spec.rb +38 -9
  647. data/spec/unit/pops/parser/evaluating_parser_spec.rb +0 -1
  648. data/spec/unit/pops/parser/lexer2_spec.rb +21 -4
  649. data/spec/unit/pops/parser/parse_basic_expressions_spec.rb +5 -0
  650. data/spec/unit/pops/parser/parse_calls_spec.rb +6 -3
  651. data/spec/unit/pops/parser/parse_conditionals_spec.rb +12 -5
  652. data/spec/unit/pops/parser/parse_containers_spec.rb +62 -7
  653. data/spec/unit/pops/parser/parse_resource_spec.rb +155 -73
  654. data/spec/unit/pops/parser/parser_spec.rb +16 -0
  655. data/spec/unit/pops/parser/parsing_typed_parameters_spec.rb +72 -0
  656. data/spec/unit/pops/transformer/transform_calls_spec.rb +1 -1
  657. data/spec/unit/pops/types/type_calculator_spec.rb +254 -57
  658. data/spec/unit/pops/types/type_factory_spec.rb +8 -3
  659. data/spec/unit/pops/types/type_parser_spec.rb +26 -5
  660. data/spec/unit/pops/validator/validator_spec.rb +143 -27
  661. data/spec/unit/provider/exec/posix_spec.rb +22 -14
  662. data/spec/unit/provider/exec/shell_spec.rb +2 -2
  663. data/spec/unit/provider/file/windows_spec.rb +7 -7
  664. data/spec/unit/provider/group/windows_adsi_spec.rb +17 -17
  665. data/spec/unit/provider/package/gem_spec.rb +10 -0
  666. data/spec/unit/provider/package/openbsd_spec.rb +66 -9
  667. data/spec/unit/provider/package/pacman_spec.rb +90 -71
  668. data/spec/unit/provider/package/windows/package_spec.rb +21 -6
  669. data/spec/unit/provider/package/yum_spec.rb +1 -0
  670. data/spec/unit/provider/parsedfile_spec.rb +1 -1
  671. data/spec/unit/provider/scheduled_task/win32_taskscheduler_spec.rb +9 -9
  672. data/spec/unit/provider/service/openbsd_spec.rb +26 -2
  673. data/spec/unit/provider/service/upstart_spec.rb +12 -1
  674. data/spec/unit/provider/ssh_authorized_key/parsed_spec.rb +6 -0
  675. data/spec/unit/provider/user/user_role_add_spec.rb +23 -1
  676. data/spec/unit/provider/user/windows_adsi_spec.rb +17 -17
  677. data/spec/unit/reports/store_spec.rb +0 -16
  678. data/spec/unit/resource/catalog_spec.rb +0 -5
  679. data/spec/unit/resource_spec.rb +2 -2
  680. data/spec/unit/settings/autosign_setting_spec.rb +2 -2
  681. data/spec/unit/settings/environment_conf_spec.rb +77 -10
  682. data/spec/unit/settings/file_setting_spec.rb +5 -4
  683. data/spec/unit/settings/priority_setting_spec.rb +4 -4
  684. data/spec/unit/settings_spec.rb +41 -3
  685. data/spec/unit/ssl/certificate_authority_spec.rb +25 -2
  686. data/spec/unit/ssl/inventory_spec.rb +13 -0
  687. data/spec/unit/ssl/validator_spec.rb +0 -1
  688. data/spec/unit/transaction/resource_harness_spec.rb +64 -0
  689. data/spec/unit/transaction_spec.rb +98 -47
  690. data/spec/unit/type/cron_spec.rb +3 -3
  691. data/spec/unit/type/exec_spec.rb +9 -0
  692. data/spec/unit/type/file/content_spec.rb +54 -71
  693. data/spec/unit/type/file/mode_spec.rb +26 -1
  694. data/spec/unit/type/file/source_spec.rb +26 -4
  695. data/spec/unit/type/file_spec.rb +3 -3
  696. data/spec/unit/type/nagios_spec.rb +12 -3
  697. data/spec/unit/type/resources_spec.rb +64 -30
  698. data/spec/unit/type/user_spec.rb +1 -1
  699. data/spec/unit/type/yumrepo_spec.rb +136 -0
  700. data/spec/unit/type/zone_spec.rb +44 -1
  701. data/spec/unit/type_spec.rb +20 -0
  702. data/spec/unit/util/colors_spec.rb +14 -8
  703. data/spec/unit/util/command_line_spec.rb +11 -7
  704. data/spec/unit/util/execution_spec.rb +35 -42
  705. data/spec/unit/util/feature_spec.rb +12 -0
  706. data/spec/unit/util/http_proxy_spec.rb +43 -1
  707. data/spec/unit/util/log/destinations_spec.rb +45 -1
  708. data/spec/unit/util/logging_spec.rb +38 -0
  709. data/spec/unit/util/pidlock_spec.rb +37 -1
  710. data/spec/unit/util/profiler/aggregate_spec.rb +59 -0
  711. data/spec/unit/util/profiler/around_profiler_spec.rb +61 -0
  712. data/spec/unit/util/profiler/logging_spec.rb +18 -29
  713. data/spec/unit/util/profiler/wall_clock_spec.rb +1 -1
  714. data/spec/unit/util/profiler_spec.rb +55 -0
  715. data/spec/unit/util/queue_spec.rb +0 -1
  716. data/spec/unit/util/rdoc/parser_spec.rb +14 -6
  717. data/spec/unit/util/tagging_spec.rb +1 -1
  718. data/spec/unit/util/windows/access_control_entry_spec.rb +1 -1
  719. data/spec/unit/util/{adsi_spec.rb → windows/adsi_spec.rb} +111 -108
  720. data/spec/unit/util/windows/api_types_spec.rb +28 -0
  721. data/spec/unit/util/windows/registry_spec.rb +7 -6
  722. data/spec/unit/util/windows/sid_spec.rb +3 -6
  723. data/spec/unit/util/windows/string_spec.rb +4 -0
  724. data/spec/unit/util/zaml_spec.rb +5 -1
  725. data/tasks/benchmark.rake +40 -5
  726. data/tasks/parser.rake +16 -2
  727. data/tasks/yard.rake +1 -1
  728. metadata +308 -150
  729. data/lib/puppet/file_system/tempfile.rb +0 -20
  730. data/lib/puppet/parser/e_parser_adapter.rb +0 -119
  731. data/lib/puppet/parser/functions/collect.rb +0 -15
  732. data/lib/puppet/parser/functions/select.rb +0 -15
  733. data/lib/puppet/pops/loader/ruby_legacy_function_instantiator.rb +0 -109
  734. data/lib/puppet/pops/parser/lexer.rb +0 -753
  735. data/lib/puppet/pops/parser/makefile +0 -6
  736. data/lib/puppet/pops/validation/checker3_1.rb +0 -558
  737. data/lib/puppet/pops/validation/validator_factory_3_1.rb +0 -31
  738. data/lib/puppet/util/profiler/none.rb +0 -8
  739. data/spec/unit/face/certificate_request_spec.rb +0 -7
  740. data/spec/unit/face/certificate_revocation_list_spec.rb +0 -7
  741. data/spec/unit/face/key_spec.rb +0 -7
  742. data/spec/unit/face/report_spec.rb +0 -7
  743. data/spec/unit/face/resource_spec.rb +0 -7
  744. data/spec/unit/face/resource_type_spec.rb +0 -7
  745. data/spec/unit/file_system/tempfile_spec.rb +0 -48
  746. data/spec/unit/parser/eparser_adapter_spec.rb +0 -407
  747. data/spec/unit/parser/methods/map_spec.rb +0 -184
  748. data/spec/unit/parser/methods/shared.rb +0 -45
  749. data/spec/unit/pops/parser/lexer_spec.rb +0 -840
  750. data/spec/unit/pops/transformer/transform_resource_spec.rb +0 -185
  751. data/spec/unit/util/profiler/none_spec.rb +0 -12
@@ -0,0 +1,171 @@
1
+ $:.unshift File.join(File.dirname(__FILE__),"..","lib")
2
+
3
+ require 'test/unit'
4
+ require 'rgen/environment'
5
+ require 'rgen/metamodel_builder'
6
+ require 'rgen/serializer/json_serializer'
7
+ require 'rgen/instantiator/json_instantiator'
8
+
9
+ class JsonTest < Test::Unit::TestCase
10
+
11
+ module TestMM
12
+ extend RGen::MetamodelBuilder::ModuleExtension
13
+ class TestNode < RGen::MetamodelBuilder::MMBase
14
+ has_attr 'text', String
15
+ has_attr 'integer', Integer
16
+ has_attr 'float', Float
17
+ has_one 'other', TestNode
18
+ contains_many 'childs', TestNode, 'parent'
19
+ end
20
+ end
21
+
22
+ module TestMMData
23
+ extend RGen::MetamodelBuilder::ModuleExtension
24
+ # class "Data" exists in the standard Ruby namespace
25
+ class Data < RGen::MetamodelBuilder::MMBase
26
+ has_attr 'notTheBuiltin', String
27
+ end
28
+ end
29
+
30
+ module TestMMSubpackage
31
+ extend RGen::MetamodelBuilder::ModuleExtension
32
+ module SubPackage
33
+ extend RGen::MetamodelBuilder::ModuleExtension
34
+ class Data < RGen::MetamodelBuilder::MMBase
35
+ has_attr 'notTheBuiltin', String
36
+ end
37
+ class Data2 < RGen::MetamodelBuilder::MMBase
38
+ has_attr 'data2', String
39
+ end
40
+ end
41
+ end
42
+
43
+ class StringWriter < String
44
+ alias write concat
45
+ end
46
+
47
+ def test_json_serializer
48
+ testModel = TestMM::TestNode.new(:text => "some text", :childs => [
49
+ TestMM::TestNode.new(:text => "child")])
50
+
51
+ output = StringWriter.new
52
+ ser = RGen::Serializer::JsonSerializer.new(output)
53
+
54
+ assert_equal %q({ "_class": "TestNode", "text": "some text", "childs": [
55
+ { "_class": "TestNode", "text": "child" }] }), ser.serialize(testModel)
56
+ end
57
+
58
+ def test_json_instantiator
59
+ env = RGen::Environment.new
60
+ inst = RGen::Instantiator::JsonInstantiator.new(env, TestMM)
61
+ inst.instantiate(%q({ "_class": "TestNode", "text": "some text", "childs": [
62
+ { "_class": "TestNode", "text": "child" }] }))
63
+ root = env.find(:class => TestMM::TestNode, :text => "some text").first
64
+ assert_not_nil root
65
+ assert_equal 1, root.childs.size
66
+ assert_equal TestMM::TestNode, root.childs.first.class
67
+ assert_equal "child", root.childs.first.text
68
+ end
69
+
70
+ def test_json_serializer_escapes
71
+ testModel = TestMM::TestNode.new(:text => %Q(some " \\ \\" text \r xx \n xx \r\n xx \t xx \b xx \f))
72
+ output = StringWriter.new
73
+ ser = RGen::Serializer::JsonSerializer.new(output)
74
+
75
+ assert_equal %q({ "_class": "TestNode", "text": "some \" \\\\ \\\\\" text \r xx \n xx \r\n xx \t xx \b xx \f" }),
76
+ ser.serialize(testModel)
77
+ end
78
+
79
+ def test_json_instantiator_escapes
80
+ env = RGen::Environment.new
81
+ inst = RGen::Instantiator::JsonInstantiator.new(env, TestMM)
82
+ inst.instantiate(%q({ "_class": "TestNode", "text": "some \" \\\\ \\\\\" text \r xx \n xx \r\n xx \t xx \b xx \f" }))
83
+ assert_equal %Q(some " \\ \\" text \r xx \n xx \r\n xx \t xx \b xx \f), env.elements.first.text
84
+ end
85
+
86
+ def test_json_instantiator_escape_single_backslash
87
+ env = RGen::Environment.new
88
+ inst = RGen::Instantiator::JsonInstantiator.new(env, TestMM)
89
+ inst.instantiate(%q({ "_class": "TestNode", "text": "a single \\ will be just itself" }))
90
+ assert_equal %q(a single \\ will be just itself), env.elements.first.text
91
+ end
92
+
93
+ def test_json_serializer_integer
94
+ testModel = TestMM::TestNode.new(:integer => 7)
95
+ output = StringWriter.new
96
+ ser = RGen::Serializer::JsonSerializer.new(output)
97
+ assert_equal %q({ "_class": "TestNode", "integer": 7 }), ser.serialize(testModel)
98
+ end
99
+
100
+ def test_json_instantiator_integer
101
+ env = RGen::Environment.new
102
+ inst = RGen::Instantiator::JsonInstantiator.new(env, TestMM)
103
+ inst.instantiate(%q({ "_class": "TestNode", "integer": 7 }))
104
+ assert_equal 7, env.elements.first.integer
105
+ end
106
+
107
+ def test_json_serializer_float
108
+ testModel = TestMM::TestNode.new(:float => 1.23)
109
+ output = StringWriter.new
110
+ ser = RGen::Serializer::JsonSerializer.new(output)
111
+ assert_equal %q({ "_class": "TestNode", "float": 1.23 }), ser.serialize(testModel)
112
+ end
113
+
114
+ def test_json_instantiator_float
115
+ env = RGen::Environment.new
116
+ inst = RGen::Instantiator::JsonInstantiator.new(env, TestMM)
117
+ inst.instantiate(%q({ "_class": "TestNode", "float": 1.23 }))
118
+ assert_equal 1.23, env.elements.first.float
119
+ end
120
+
121
+ def test_json_instantiator_conflict_builtin
122
+ env = RGen::Environment.new
123
+ inst = RGen::Instantiator::JsonInstantiator.new(env, TestMMData)
124
+ inst.instantiate(%q({ "_class": "Data", "notTheBuiltin": "for sure" }))
125
+ assert_equal "for sure", env.elements.first.notTheBuiltin
126
+ end
127
+
128
+ def test_json_serializer_subpacakge
129
+ testModel = TestMMSubpackage::SubPackage::Data2.new(:data2 => "xxx")
130
+ output = StringWriter.new
131
+ ser = RGen::Serializer::JsonSerializer.new(output)
132
+ assert_equal %q({ "_class": "Data2", "data2": "xxx" }), ser.serialize(testModel)
133
+ end
134
+
135
+ def test_json_instantiator_builtin_in_subpackage
136
+ env = RGen::Environment.new
137
+ inst = RGen::Instantiator::JsonInstantiator.new(env, TestMMSubpackage)
138
+ inst.instantiate(%q({ "_class": "Data", "notTheBuiltin": "for sure" }))
139
+ assert_equal "for sure", env.elements.first.notTheBuiltin
140
+ end
141
+
142
+ def test_json_instantiator_subpackage
143
+ env = RGen::Environment.new
144
+ inst = RGen::Instantiator::JsonInstantiator.new(env, TestMMSubpackage)
145
+ inst.instantiate(%q({ "_class": "Data2", "data2": "something" }))
146
+ assert_equal "something", env.elements.first.data2
147
+ end
148
+
149
+ def test_json_instantiator_subpackage_no_shortname_opt
150
+ env = RGen::Environment.new
151
+ inst = RGen::Instantiator::JsonInstantiator.new(env, TestMMSubpackage, :short_class_names => false)
152
+ assert_raise RuntimeError do
153
+ inst.instantiate(%q({ "_class": "Data2", "data2": "something" }))
154
+ end
155
+ end
156
+
157
+ def test_json_instantiator_references
158
+ env = RGen::Environment.new
159
+ inst = RGen::Instantiator::JsonInstantiator.new(env, TestMM, :nameAttribute => "text")
160
+ inst.instantiate(%q([
161
+ { "_class": "TestNode", "text": "A", "childs": [
162
+ { "_class": "TestNode", "text": "B" } ]},
163
+ { "_class": "TestNode", "text": "C", "other": "/A/B"}]
164
+ ))
165
+ nodeA = env.find(:class => TestMM::TestNode, :text => "A").first
166
+ nodeC = env.find(:class => TestMM::TestNode, :text => "C").first
167
+ assert_equal 1, nodeA.childs.size
168
+ assert_equal nodeA.childs[0], nodeC.other
169
+ end
170
+ end
171
+
@@ -0,0 +1,1482 @@
1
+ $:.unshift File.join(File.dirname(__FILE__),"..","lib")
2
+
3
+ require 'test/unit'
4
+ require 'rgen/metamodel_builder'
5
+ require 'rgen/array_extensions'
6
+ require 'bigdecimal'
7
+
8
+ class MetamodelBuilderTest < Test::Unit::TestCase
9
+
10
+ module TestMetamodel
11
+ extend RGen::MetamodelBuilder::ModuleExtension
12
+
13
+ class SimpleClass < RGen::MetamodelBuilder::MMBase
14
+ KindType = RGen::MetamodelBuilder::DataTypes::Enum.new([:simple, :extended])
15
+ has_attr 'name' # default is String
16
+ has_attr 'stringWithDefault', String, :defaultValueLiteral => "xtest"
17
+ has_attr 'integerWithDefault', Integer, :defaultValueLiteral => "123"
18
+ has_attr 'longWithDefault', Long, :defaultValueLiteral => "1234567890"
19
+ has_attr 'floatWithDefault', Float, :defaultValueLiteral => "0.123"
20
+ has_attr 'boolWithDefault', Boolean, :defaultValueLiteral => "true"
21
+ has_attr 'anything', Object
22
+ has_attr 'allowed', RGen::MetamodelBuilder::DataTypes::Boolean
23
+ has_attr 'kind', KindType
24
+ has_attr 'kindWithDefault', KindType, :defaultValueLiteral => "extended"
25
+ end
26
+
27
+ class ManyAttrClass < RGen::MetamodelBuilder::MMBase
28
+ has_many_attr 'literals', String
29
+ has_many_attr 'bools', Boolean
30
+ has_many_attr 'integers', Integer
31
+ has_many_attr 'enums', RGen::MetamodelBuilder::DataTypes::Enum.new([:a, :b, :c])
32
+ has_many_attr 'limitTest', Integer, :upperBound => 2
33
+ end
34
+
35
+ class ClassA < RGen::MetamodelBuilder::MMBase
36
+ # metamodel accessors must work independent of the ==() method
37
+ module ClassModule
38
+ def ==(o)
39
+ o.is_a?(ClassA)
40
+ end
41
+ end
42
+ end
43
+
44
+ class ClassB < RGen::MetamodelBuilder::MMBase
45
+ end
46
+
47
+ class ClassC < RGen::MetamodelBuilder::MMBase
48
+ end
49
+
50
+ class HasOneTestClass < RGen::MetamodelBuilder::MMBase
51
+ has_one 'classA', ClassA
52
+ has_one 'classB', ClassB
53
+ end
54
+
55
+ class HasManyTestClass < RGen::MetamodelBuilder::MMBase
56
+ has_many 'classA', ClassA
57
+ end
58
+
59
+ class OneClass < RGen::MetamodelBuilder::MMBase
60
+ end
61
+ class ManyClass < RGen::MetamodelBuilder::MMBase
62
+ end
63
+ OneClass.one_to_many 'manyClasses', ManyClass, 'oneClass', :upperBound => 5
64
+
65
+ class AClassMM < RGen::MetamodelBuilder::MMBase
66
+ end
67
+ class BClassMM < RGen::MetamodelBuilder::MMBase
68
+ end
69
+ AClassMM.many_to_many 'bClasses', BClassMM, 'aClasses'
70
+
71
+ module SomePackage
72
+ extend RGen::MetamodelBuilder::ModuleExtension
73
+
74
+ class ClassA < RGen::MetamodelBuilder::MMBase
75
+ end
76
+
77
+ module SubPackage
78
+ extend RGen::MetamodelBuilder::ModuleExtension
79
+
80
+ class ClassB < RGen::MetamodelBuilder::MMBase
81
+ end
82
+ end
83
+ end
84
+
85
+ class OneClass2 < RGen::MetamodelBuilder::MMBase
86
+ end
87
+ class ManyClass2 < RGen::MetamodelBuilder::MMBase
88
+ end
89
+ ManyClass2.many_to_one 'oneClass', OneClass2, 'manyClasses'
90
+
91
+ class AClassOO < RGen::MetamodelBuilder::MMBase
92
+ end
93
+ class BClassOO < RGen::MetamodelBuilder::MMBase
94
+ end
95
+ AClassOO.one_to_one 'bClass', BClassOO, 'aClass'
96
+
97
+ class SomeSuperClass < RGen::MetamodelBuilder::MMBase
98
+ has_attr "name"
99
+ has_many "classAs", ClassA
100
+ end
101
+
102
+ class SomeSubClass < SomeSuperClass
103
+ has_attr "subname"
104
+ has_many "classBs", ClassB
105
+ end
106
+
107
+ class OtherSubClass < SomeSuperClass
108
+ has_attr "othersubname"
109
+ has_many "classCs", ClassC
110
+ end
111
+
112
+ class SubSubClass < RGen::MetamodelBuilder::MMMultiple(SomeSubClass, OtherSubClass)
113
+ has_attr "subsubname"
114
+ end
115
+
116
+ module AnnotatedModule
117
+ extend RGen::MetamodelBuilder::ModuleExtension
118
+
119
+ annotation "moduletag" => "modulevalue"
120
+
121
+ class AnnotatedClass < RGen::MetamodelBuilder::MMBase
122
+ annotation "sometag" => "somevalue", "othertag" => "othervalue"
123
+ annotation :source => "rgen/test", :details => {"thirdtag" => "thirdvalue"}
124
+
125
+ has_attr "boolAttr", Boolean do
126
+ annotation "attrtag" => "attrval"
127
+ annotation :source => "rgen/test2", :details => {"attrtag2" => "attrvalue2", "attrtag3" => "attrvalue3"}
128
+ end
129
+
130
+ has_many "others", AnnotatedClass do
131
+ annotation "reftag" => "refval"
132
+ annotation :source => "rgen/test3", :details => {"reftag2" => "refvalue2", "reftag3" => "refvalue3"}
133
+ end
134
+
135
+ many_to_many "m2m", AnnotatedClass, "m2mback" do
136
+ annotation "m2mtag" => "m2mval"
137
+ opposite_annotation "opposite_m2mtag" => "opposite_m2mval"
138
+ end
139
+ end
140
+
141
+ end
142
+
143
+ class AbstractClass < RGen::MetamodelBuilder::MMBase
144
+ abstract
145
+ end
146
+
147
+ class ContainedClass < RGen::MetamodelBuilder::MMBase
148
+ end
149
+
150
+ class ContainerClass < RGen::MetamodelBuilder::MMBase
151
+ contains_one_uni 'oneChildUni', ContainedClass
152
+ contains_one_uni 'oneChildUni2', ContainedClass
153
+ contains_one 'oneChild', ContainedClass, 'parentOne'
154
+ contains_one 'oneChild2', ContainedClass, 'parentOne2'
155
+ contains_many_uni 'manyChildUni', ContainedClass
156
+ contains_many_uni 'manyChildUni2', ContainedClass
157
+ contains_many 'manyChild', ContainedClass, 'parentMany'
158
+ contains_many 'manyChild2', ContainedClass, 'parentMany2'
159
+ end
160
+
161
+ class NestedContainerClass < ContainedClass
162
+ contains_one_uni 'oneChildUni', ContainedClass
163
+ end
164
+
165
+ class OppositeRefAssocA < RGen::MetamodelBuilder::MMBase
166
+ end
167
+ class OppositeRefAssocB < RGen::MetamodelBuilder::MMBase
168
+ end
169
+ OppositeRefAssocA.one_to_one 'bClass', OppositeRefAssocB, 'aClass'
170
+
171
+ end
172
+
173
+ def mm
174
+ TestMetamodel
175
+ end
176
+
177
+ def test_has_attr
178
+ sc = mm::SimpleClass.new
179
+
180
+ assert_respond_to sc, :name
181
+ assert_respond_to sc, :name=
182
+ sc.name = "TestName"
183
+ assert_equal "TestName", sc.name
184
+ sc.name = nil
185
+ assert_equal nil, sc.name
186
+ err = assert_raise StandardError do
187
+ sc.name = 5
188
+ end
189
+ assert_match /In (\w+::)+SimpleClass : Can not use a Fixnum where a String is expected/, err.message
190
+ assert_equal "EString", mm::SimpleClass.ecore.eAttributes.find{|a| a.name=="name"}.eType.name
191
+
192
+ assert_equal "xtest", sc.stringWithDefault
193
+ assert_equal :extended, sc.kindWithDefault
194
+ assert_equal 123, sc.integerWithDefault
195
+ assert_equal 1234567890, sc.longWithDefault
196
+ assert_equal 0.123, sc.floatWithDefault
197
+ assert_equal true, sc.boolWithDefault
198
+
199
+ # setting nil should not make the default value appear on next read
200
+ sc.stringWithDefault = nil
201
+ assert_nil sc.stringWithDefault
202
+
203
+ sc.anything = :asymbol
204
+ assert_equal :asymbol, sc.anything
205
+ sc.anything = self # a class
206
+ assert_equal self, sc.anything
207
+
208
+ assert_respond_to sc, :allowed
209
+ assert_respond_to sc, :allowed=
210
+ sc.allowed = true
211
+ assert_equal true, sc.allowed
212
+ sc.allowed = false
213
+ assert_equal false, sc.allowed
214
+ sc.allowed = nil
215
+ assert_equal nil, sc.allowed
216
+ err = assert_raise StandardError do
217
+ sc.allowed = :someSymbol
218
+ end
219
+ assert_match /In (\w+::)+SimpleClass : Can not use a Symbol\(:someSymbol\) where a \[true,false\] is expected/, err.message
220
+ err = assert_raise StandardError do
221
+ sc.allowed = "a string"
222
+ end
223
+ assert_match /In (\w+::)+SimpleClass : Can not use a String where a \[true,false\] is expected/, err.message
224
+ assert_equal "EBoolean", mm::SimpleClass.ecore.eAttributes.find{|a| a.name=="allowed"}.eType.name
225
+
226
+ assert_respond_to sc, :kind
227
+ assert_respond_to sc, :kind=
228
+ sc.kind = :simple
229
+ assert_equal :simple, sc.kind
230
+ sc.kind = :extended
231
+ assert_equal :extended, sc.kind
232
+ sc.kind = nil
233
+ assert_equal nil, sc.kind
234
+ err = assert_raise StandardError do
235
+ sc.kind = :false
236
+ end
237
+ assert_match /In (\w+::)+SimpleClass : Can not use a Symbol\(:false\) where a \[:simple,:extended\] is expected/, err.message
238
+ err = assert_raise StandardError do
239
+ sc.kind = "a string"
240
+ end
241
+ assert_match /In (\w+::)+SimpleClass : Can not use a String where a \[:simple,:extended\] is expected/, err.message
242
+
243
+ enum = mm::SimpleClass.ecore.eAttributes.find{|a| a.name=="kind"}.eType
244
+ assert_equal ["extended", "simple"], enum.eLiterals.name.sort
245
+ end
246
+
247
+ def test_float
248
+ sc = mm::SimpleClass.new
249
+ sc.floatWithDefault = 7.89
250
+ assert_equal 7.89, sc.floatWithDefault
251
+ if BigDecimal.double_fig == 16
252
+ sc.floatWithDefault = 123456789012345678.0
253
+ # loss of precision
254
+ assert_equal "123456789012345680.0", sprintf("%.1f", sc.floatWithDefault)
255
+ end
256
+ sc.floatWithDefault = nil
257
+ sc.floatWithDefault = BigDecimal.new("123456789012345678.0")
258
+ assert sc.floatWithDefault.is_a?(BigDecimal)
259
+ assert_equal "123456789012345678.0", sc.floatWithDefault.to_s("F")
260
+
261
+ dump = Marshal.dump(sc)
262
+ sc2 = Marshal.load(dump)
263
+ assert sc2.floatWithDefault.is_a?(BigDecimal)
264
+ assert_equal "123456789012345678.0", sc2.floatWithDefault.to_s("F")
265
+ end
266
+
267
+ def test_long
268
+ sc = mm::SimpleClass.new
269
+ sc.longWithDefault = 5
270
+ assert_equal 5, sc.longWithDefault
271
+ sc.longWithDefault = 1234567890
272
+ assert_equal 1234567890, sc.longWithDefault
273
+ assert sc.longWithDefault.is_a?(Bignum)
274
+ assert sc.longWithDefault.is_a?(Integer)
275
+ err = assert_raise StandardError do
276
+ sc.longWithDefault = "a string"
277
+ end
278
+ assert_match /In (\w+::)+SimpleClass : Can not use a String where a Integer is expected/, err.message
279
+ end
280
+
281
+ def test_many_attr
282
+ o = mm::ManyAttrClass.new
283
+
284
+ assert_respond_to o, :literals
285
+ assert_respond_to o, :addLiterals
286
+ assert_respond_to o, :removeLiterals
287
+
288
+ err = assert_raise(StandardError) do
289
+ o.addLiterals(1)
290
+ end
291
+ assert_match /In (\w+::)+ManyAttrClass : Can not use a Fixnum where a String is expected/, err.message
292
+
293
+ assert_equal [], o.literals
294
+ o.addLiterals("a")
295
+ assert_equal ["a"], o.literals
296
+ o.addLiterals("b")
297
+ assert_equal ["a", "b"], o.literals
298
+ o.addLiterals("b")
299
+ assert_equal ["a", "b", "b"], o.literals
300
+ # attributes allow the same object several times
301
+ o.addLiterals(o.literals.first)
302
+ assert_equal ["a", "b", "b", "a"], o.literals
303
+ assert o.literals[0].object_id == o.literals[3].object_id
304
+ # removing works by object identity, so providing a new string won't delete an existing one
305
+ o.removeLiterals("a")
306
+ assert_equal ["a", "b", "b", "a"], o.literals
307
+ theA = o.literals.first
308
+ # each remove command removes only one element: remove first "a"
309
+ o.removeLiterals(theA)
310
+ assert_equal ["b", "b", "a"], o.literals
311
+ # remove second "a" (same object)
312
+ o.removeLiterals(theA)
313
+ assert_equal ["b", "b"], o.literals
314
+ o.removeLiterals(o.literals.first)
315
+ assert_equal ["b"], o.literals
316
+ o.removeLiterals(o.literals.first)
317
+ assert_equal [], o.literals
318
+
319
+ # setting multiple elements at a time
320
+ o.literals = ["a", "b", "c"]
321
+ assert_equal ["a", "b", "c"], o.literals
322
+ # can only take enumerables
323
+ err = assert_raise(StandardError) do
324
+ o.literals = 1
325
+ end
326
+ assert_match /In (\w+::)+ManyAttrClass : Can not use a Fixnum where a Enumerable is expected/, err.message
327
+
328
+ o.bools = [true, false, true, false]
329
+ assert_equal [true, false, true, false], o.bools
330
+
331
+ o.integers = [1, 2, 2, 3, 3]
332
+ assert_equal [1, 2, 2, 3, 3], o.integers
333
+
334
+ o.enums = [:a, :a, :b, :c, :c]
335
+ assert_equal [:a, :a, :b, :c, :c], o.enums
336
+
337
+ lit = mm::ManyAttrClass.ecore.eAttributes.find{|a| a.name == "literals"}
338
+ assert lit.is_a?(RGen::ECore::EAttribute)
339
+ assert lit.many
340
+
341
+ lim = mm::ManyAttrClass.ecore.eAttributes.find{|a| a.name == "limitTest"}
342
+ assert lit.many
343
+ assert_equal 2, lim.upperBound
344
+ end
345
+
346
+ def test_many_attr_insert
347
+ o = mm::ManyAttrClass.new
348
+ o.addLiterals("a")
349
+ o.addLiterals("b", 0)
350
+ o.addLiterals("c", 1)
351
+ assert_equal ["b", "c", "a"], o.literals
352
+ end
353
+
354
+ def test_has_one
355
+ sc = mm::HasOneTestClass.new
356
+ assert_respond_to sc, :classA
357
+ assert_respond_to sc, :classA=
358
+ ca = mm::ClassA.new
359
+ sc.classA = ca
360
+ assert_equal ca, sc.classA
361
+ sc.classA = nil
362
+ assert_equal nil, sc.classA
363
+
364
+ assert_respond_to sc, :classB
365
+ assert_respond_to sc, :classB=
366
+ cb = mm::ClassB.new
367
+ sc.classB = cb
368
+ assert_equal cb, sc.classB
369
+
370
+ err = assert_raise StandardError do
371
+ sc.classB = ca
372
+ end
373
+ assert_match /In (\w+::)+HasOneTestClass : Can not use a (\w+::)+ClassA where a (\w+::)+ClassB is expected/, err.message
374
+
375
+ assert_equal [], mm::ClassA.ecore.eReferences
376
+ assert_equal [], mm::ClassB.ecore.eReferences
377
+ assert_equal ["classA", "classB"].sort, mm::HasOneTestClass.ecore.eReferences.name.sort
378
+ assert_equal [], mm::HasOneTestClass.ecore.eReferences.select { |a| a.many == true }
379
+ assert_equal [], mm::HasOneTestClass.ecore.eAttributes
380
+ end
381
+
382
+ def test_has_many
383
+ o = mm::HasManyTestClass.new
384
+ ca1 = mm::ClassA.new
385
+ ca2 = mm::ClassA.new
386
+ ca3 = mm::ClassA.new
387
+ o.addClassA(ca1)
388
+ o.addClassA(ca2)
389
+ assert_equal [ca1, ca2], o.classA
390
+ # make sure we get a copy
391
+ o.classA.clear
392
+ assert_equal [ca1, ca2], o.classA
393
+ o.removeClassA(ca3)
394
+ assert_equal [ca1, ca2], o.classA
395
+ o.removeClassA(ca2)
396
+ assert_equal [ca1], o.classA
397
+ err = assert_raise StandardError do
398
+ o.addClassA(mm::ClassB.new)
399
+ end
400
+ assert_match /In (\w+::)+HasManyTestClass : Can not use a (\w+::)+ClassB where a (\w+::)+ClassA is expected/, err.message
401
+ assert_equal [], mm::HasManyTestClass.ecore.eReferences.select{|r| r.many == false}
402
+ assert_equal ["classA"], mm::HasManyTestClass.ecore.eReferences.select{|r| r.many == true}.name
403
+ end
404
+
405
+ def test_has_many_insert
406
+ o = mm::HasManyTestClass.new
407
+ ca1 = mm::ClassA.new
408
+ ca2 = mm::ClassA.new
409
+ ca3 = mm::ClassA.new
410
+ ca4 = mm::ClassA.new
411
+ ca5 = mm::ClassA.new
412
+ o.addClassA(ca1)
413
+ o.addClassA(ca2)
414
+ o.addClassA(ca3,0)
415
+ o.addClassA(ca4,1)
416
+ o.addGeneric("classA",ca5,2)
417
+ assert_equal [ca3, ca4, ca5, ca1, ca2], o.classA
418
+ end
419
+
420
+ def test_one_to_many
421
+ oc = mm::OneClass.new
422
+ assert_respond_to oc, :manyClasses
423
+ assert oc.manyClasses.empty?
424
+
425
+ mc = mm::ManyClass.new
426
+ assert_respond_to mc, :oneClass
427
+ assert_respond_to mc, :oneClass=
428
+ assert_nil mc.oneClass
429
+
430
+ # put the OneClass into the ManyClass
431
+ mc.oneClass = oc
432
+ assert_equal oc, mc.oneClass
433
+ assert oc.manyClasses.include?(mc)
434
+
435
+ # remove the OneClass from the ManyClass
436
+ mc.oneClass = nil
437
+ assert_equal nil, mc.oneClass
438
+ assert !oc.manyClasses.include?(mc)
439
+
440
+ # put the ManyClass into the OneClass
441
+ oc.addManyClasses mc
442
+ assert oc.manyClasses.include?(mc)
443
+ assert_equal oc, mc.oneClass
444
+
445
+ # remove the ManyClass from the OneClass
446
+ oc.removeManyClasses mc
447
+ assert !oc.manyClasses.include?(mc)
448
+ assert_equal nil, mc.oneClass
449
+
450
+ assert_equal [], mm::OneClass.ecore.eReferences.select{|r| r.many == false}
451
+ assert_equal ["manyClasses"], mm::OneClass.ecore.eReferences.select{|r| r.many == true}.name
452
+ assert_equal 5, mm::OneClass.ecore.eReferences.find{|r| r.many == true}.upperBound
453
+ assert_equal ["oneClass"], mm::ManyClass.ecore.eReferences.select{|r| r.many == false}.name
454
+ assert_equal [], mm::ManyClass.ecore.eReferences.select{|r| r.many == true}
455
+ end
456
+
457
+ def test_one_to_many_replace1
458
+ oc1 = mm::OneClass.new
459
+ oc2 = mm::OneClass.new
460
+ mc = mm::ManyClass.new
461
+
462
+ oc1.manyClasses = [mc]
463
+ assert_equal [mc], oc1.manyClasses
464
+ assert_equal [], oc2.manyClasses
465
+ assert_equal oc1, mc.oneClass
466
+
467
+ oc2.manyClasses = [mc]
468
+ assert_equal [mc], oc2.manyClasses
469
+ assert_equal [], oc1.manyClasses
470
+ assert_equal oc2, mc.oneClass
471
+ end
472
+
473
+ def test_one_to_many_replace2
474
+ oc = mm::OneClass.new
475
+ mc1 = mm::ManyClass.new
476
+ mc2 = mm::ManyClass.new
477
+
478
+ mc1.oneClass = oc
479
+ assert_equal [mc1], oc.manyClasses
480
+ assert_equal oc, mc1.oneClass
481
+ assert_equal nil, mc2.oneClass
482
+
483
+ mc2.oneClass = oc
484
+ assert_equal [mc1, mc2], oc.manyClasses
485
+ assert_equal oc, mc1.oneClass
486
+ assert_equal oc, mc2.oneClass
487
+ end
488
+
489
+ def test_one_to_many_insert
490
+ oc = mm::OneClass.new
491
+ mc1 = mm::ManyClass.new
492
+ mc2 = mm::ManyClass.new
493
+
494
+ oc.addManyClasses(mc1, 0)
495
+ oc.addManyClasses(mc2, 0)
496
+ assert_equal [mc2, mc1], oc.manyClasses
497
+ assert_equal oc, mc1.oneClass
498
+ assert_equal oc, mc2.oneClass
499
+ end
500
+
501
+ def test_one_to_many2
502
+ oc = mm::OneClass2.new
503
+ assert_respond_to oc, :manyClasses
504
+ assert oc.manyClasses.empty?
505
+
506
+ mc = mm::ManyClass2.new
507
+ assert_respond_to mc, :oneClass
508
+ assert_respond_to mc, :oneClass=
509
+ assert_nil mc.oneClass
510
+
511
+ # put the OneClass into the ManyClass
512
+ mc.oneClass = oc
513
+ assert_equal oc, mc.oneClass
514
+ assert oc.manyClasses.include?(mc)
515
+
516
+ # remove the OneClass from the ManyClass
517
+ mc.oneClass = nil
518
+ assert_equal nil, mc.oneClass
519
+ assert !oc.manyClasses.include?(mc)
520
+
521
+ # put the ManyClass into the OneClass
522
+ oc.addManyClasses mc
523
+ assert oc.manyClasses.include?(mc)
524
+ assert_equal oc, mc.oneClass
525
+
526
+ # remove the ManyClass from the OneClass
527
+ oc.removeManyClasses mc
528
+ assert !oc.manyClasses.include?(mc)
529
+ assert_equal nil, mc.oneClass
530
+
531
+ assert_equal [], mm::OneClass2.ecore.eReferences.select{|r| r.many == false}
532
+ assert_equal ["manyClasses"], mm::OneClass2.ecore.eReferences.select{|r| r.many == true}.name
533
+ assert_equal ["oneClass"], mm::ManyClass2.ecore.eReferences.select{|r| r.many == false}.name
534
+ assert_equal [], mm::ManyClass2.ecore.eReferences.select{|r| r.many == true}
535
+ end
536
+
537
+ def test_one_to_one
538
+ ac = mm::AClassOO.new
539
+ assert_respond_to ac, :bClass
540
+ assert_respond_to ac, :bClass=
541
+ assert_nil ac.bClass
542
+
543
+ bc = mm::BClassOO.new
544
+ assert_respond_to bc, :aClass
545
+ assert_respond_to bc, :aClass=
546
+ assert_nil bc.aClass
547
+
548
+ # put the AClass into the BClass
549
+ bc.aClass = ac
550
+ assert_equal ac, bc.aClass
551
+ assert_equal bc, ac.bClass
552
+
553
+ # remove the AClass from the BClass
554
+ bc.aClass = nil
555
+ assert_equal nil, bc.aClass
556
+ assert_equal nil, ac.bClass
557
+
558
+ # put the BClass into the AClass
559
+ ac.bClass = bc
560
+ assert_equal bc, ac.bClass
561
+ assert_equal ac, bc.aClass
562
+
563
+ # remove the BClass from the AClass
564
+ ac.bClass = nil
565
+ assert_equal nil, ac.bClass
566
+ assert_equal nil, bc.aClass
567
+
568
+ assert_equal ["bClass"], mm::AClassOO.ecore.eReferences.select{|r| r.many == false}.name
569
+ assert_equal [], mm::AClassOO.ecore.eReferences.select{|r| r.many == true}
570
+ assert_equal ["aClass"], mm::BClassOO.ecore.eReferences.select{|r| r.many == false}.name
571
+ assert_equal [], mm::BClassOO.ecore.eReferences.select{|r| r.many == true}
572
+ end
573
+
574
+ def test_one_to_one_replace
575
+ a = mm::AClassOO.new
576
+ b1 = mm::BClassOO.new
577
+ b2 = mm::BClassOO.new
578
+
579
+ a.bClass = b1
580
+ assert_equal b1, a.bClass
581
+ assert_equal a, b1.aClass
582
+ assert_equal nil, b2.aClass
583
+
584
+ a.bClass = b2
585
+ assert_equal b2, a.bClass
586
+ assert_equal nil, b1.aClass
587
+ assert_equal a, b2.aClass
588
+ end
589
+
590
+ def test_many_to_many
591
+
592
+ ac = mm::AClassMM.new
593
+ assert_respond_to ac, :bClasses
594
+ assert ac.bClasses.empty?
595
+
596
+ bc = mm::BClassMM.new
597
+ assert_respond_to bc, :aClasses
598
+ assert bc.aClasses.empty?
599
+
600
+ # put the AClass into the BClass
601
+ bc.addAClasses ac
602
+ assert bc.aClasses.include?(ac)
603
+ assert ac.bClasses.include?(bc)
604
+
605
+ # put something else into the BClass
606
+ err = assert_raise StandardError do
607
+ bc.addAClasses :notaaclass
608
+ end
609
+ assert_match /In (\w+::)+BClassMM : Can not use a Symbol\(:notaaclass\) where a (\w+::)+AClassMM is expected/, err.message
610
+
611
+ # remove the AClass from the BClass
612
+ bc.removeAClasses ac
613
+ assert !bc.aClasses.include?(ac)
614
+ assert !ac.bClasses.include?(bc)
615
+
616
+ # put the BClass into the AClass
617
+ ac.addBClasses bc
618
+ assert ac.bClasses.include?(bc)
619
+ assert bc.aClasses.include?(ac)
620
+
621
+ # put something else into the AClass
622
+ err = assert_raise StandardError do
623
+ ac.addBClasses :notabclass
624
+ end
625
+ assert_match /In (\w+::)+AClassMM : Can not use a Symbol\(:notabclass\) where a (\w+::)+BClassMM is expected/, err.message
626
+
627
+ # remove the BClass from the AClass
628
+ ac.removeBClasses bc
629
+ assert !ac.bClasses.include?(bc)
630
+ assert !bc.aClasses.include?(ac)
631
+
632
+ assert_equal [], mm::AClassMM.ecore.eReferences.select{|r| r.many == false}
633
+ assert_equal ["bClasses"], mm::AClassMM.ecore.eReferences.select{|r| r.many == true}.name
634
+ assert_equal [], mm::BClassMM.ecore.eReferences.select{|r| r.many == false}
635
+ assert_equal ["aClasses"], mm::BClassMM.ecore.eReferences.select{|r| r.many == true}.name
636
+ end
637
+
638
+ def test_many_to_many_insert
639
+ ac1 = mm::AClassMM.new
640
+ ac2 = mm::AClassMM.new
641
+ bc1= mm::BClassMM.new
642
+ bc2= mm::BClassMM.new
643
+
644
+ ac1.addBClasses(bc1)
645
+ ac1.addBClasses(bc2, 0)
646
+ ac2.addBClasses(bc1)
647
+ ac2.addBClasses(bc2, 0)
648
+
649
+ assert_equal [bc2, bc1], ac1.bClasses
650
+ assert_equal [bc2, bc1], ac2.bClasses
651
+ assert_equal [ac1, ac2], bc1.aClasses
652
+ assert_equal [ac1, ac2], bc2.aClasses
653
+ end
654
+
655
+ def test_inheritance
656
+ assert_equal ["name"], mm::SomeSuperClass.ecore.eAllAttributes.name
657
+ assert_equal ["classAs"], mm::SomeSuperClass.ecore.eAllReferences.name
658
+ assert_equal ["name", "subname"], mm::SomeSubClass.ecore.eAllAttributes.name.sort
659
+ assert_equal ["classAs", "classBs"], mm::SomeSubClass.ecore.eAllReferences.name.sort
660
+ assert_equal ["name", "othersubname"], mm::OtherSubClass.ecore.eAllAttributes.name.sort
661
+ assert_equal ["classAs", "classCs"], mm::OtherSubClass.ecore.eAllReferences.name.sort
662
+ assert mm::SomeSubClass.new.is_a?(mm::SomeSuperClass)
663
+ assert_equal ["name", "othersubname", "subname", "subsubname"], mm::SubSubClass.ecore.eAllAttributes.name.sort
664
+ assert_equal ["classAs", "classBs", "classCs"], mm::SubSubClass.ecore.eAllReferences.name.sort
665
+ assert mm::SubSubClass.new.is_a?(mm::SomeSuperClass)
666
+ assert mm::SubSubClass.new.is_a?(mm::SomeSubClass)
667
+ assert mm::SubSubClass.new.is_a?(mm::OtherSubClass)
668
+ end
669
+
670
+ def test_annotations
671
+ assert_equal 1, mm::AnnotatedModule.ecore.eAnnotations.size
672
+ anno = mm::AnnotatedModule.ecore.eAnnotations.first
673
+ checkAnnotation(anno, nil, {"moduletag" => "modulevalue"})
674
+
675
+ eClass = mm::AnnotatedModule::AnnotatedClass.ecore
676
+ assert_equal 2, eClass.eAnnotations.size
677
+ anno = eClass.eAnnotations.find{|a| a.source == "rgen/test"}
678
+ checkAnnotation(anno, "rgen/test", {"thirdtag" => "thirdvalue"})
679
+ anno = eClass.eAnnotations.find{|a| a.source == nil}
680
+ checkAnnotation(anno, nil, {"sometag" => "somevalue", "othertag" => "othervalue"})
681
+
682
+ eAttr = eClass.eAttributes.first
683
+ assert_equal 2, eAttr.eAnnotations.size
684
+ anno = eAttr.eAnnotations.find{|a| a.source == "rgen/test2"}
685
+ checkAnnotation(anno, "rgen/test2", {"attrtag2" => "attrvalue2", "attrtag3" => "attrvalue3"})
686
+ anno = eAttr.eAnnotations.find{|a| a.source == nil}
687
+ checkAnnotation(anno, nil, {"attrtag" => "attrval"})
688
+
689
+ eRef = eClass.eReferences.find{|r| !r.eOpposite}
690
+ assert_equal 2, eRef.eAnnotations.size
691
+ anno = eRef.eAnnotations.find{|a| a.source == "rgen/test3"}
692
+ checkAnnotation(anno, "rgen/test3", {"reftag2" => "refvalue2", "reftag3" => "refvalue3"})
693
+ anno = eRef.eAnnotations.find{|a| a.source == nil}
694
+ checkAnnotation(anno, nil, {"reftag" => "refval"})
695
+
696
+ eRef = eClass.eReferences.find{|r| r.eOpposite}
697
+ assert_equal 1, eRef.eAnnotations.size
698
+ anno = eRef.eAnnotations.first
699
+ checkAnnotation(anno, nil, {"m2mtag" => "m2mval"})
700
+ eRef = eRef.eOpposite
701
+ assert_equal 1, eRef.eAnnotations.size
702
+ anno = eRef.eAnnotations.first
703
+ checkAnnotation(anno, nil, {"opposite_m2mtag" => "opposite_m2mval"})
704
+ end
705
+
706
+ def checkAnnotation(anno, source, hash)
707
+ assert anno.is_a?(RGen::ECore::EAnnotation)
708
+ assert_equal source, anno.source
709
+ assert_equal hash.size, anno.details.size
710
+ hash.each_pair do |k, v|
711
+ detail = anno.details.find{|d| d.key == k}
712
+ assert detail.is_a?(RGen::ECore::EStringToStringMapEntry)
713
+ assert_equal v, detail.value
714
+ end
715
+ end
716
+
717
+ def test_ecore_identity
718
+ subPackage = mm::SomePackage::SubPackage.ecore
719
+ assert_equal subPackage.eClassifiers.first.object_id, mm::SomePackage::SubPackage::ClassB.ecore.object_id
720
+
721
+ somePackage = mm::SomePackage.ecore
722
+ assert_equal somePackage.eSubpackages.first.object_id, subPackage.object_id
723
+ end
724
+
725
+ def test_proxy
726
+ p = RGen::MetamodelBuilder::MMProxy.new("test")
727
+ assert_equal "test", p.targetIdentifier
728
+ p.targetIdentifier = 123
729
+ assert_equal 123, p.targetIdentifier
730
+ p.data = "additional info"
731
+ assert_equal "additional info", p.data
732
+ q = RGen::MetamodelBuilder::MMProxy.new("ident", "data")
733
+ assert_equal "data", q.data
734
+ end
735
+
736
+ def test_proxies_has_one
737
+ e = mm::HasOneTestClass.new
738
+ proxy = RGen::MetamodelBuilder::MMProxy.new
739
+ e.classA = proxy
740
+ assert_equal proxy, e.classA
741
+ a = mm::ClassA.new
742
+ # displace proxy
743
+ e.classA = a
744
+ assert_equal a, e.classA
745
+ # displace by proxy
746
+ e.classA = proxy
747
+ assert_equal proxy, e.classA
748
+ end
749
+
750
+ def test_proxies_has_many
751
+ e = mm::HasManyTestClass.new
752
+ proxy = RGen::MetamodelBuilder::MMProxy.new
753
+ e.addClassA(proxy)
754
+ assert_equal [proxy], e.classA
755
+ # again
756
+ e.addClassA(proxy)
757
+ assert_equal [proxy], e.classA
758
+ proxy2 = RGen::MetamodelBuilder::MMProxy.new
759
+ e.addClassA(proxy2)
760
+ assert_equal [proxy, proxy2], e.classA
761
+ e.removeClassA(proxy)
762
+ assert_equal [proxy2], e.classA
763
+ # again
764
+ e.removeClassA(proxy)
765
+ assert_equal [proxy2], e.classA
766
+ e.removeClassA(proxy2)
767
+ assert_equal [], e.classA
768
+ end
769
+
770
+ def test_proxies_one_to_one
771
+ ea = mm::AClassOO.new
772
+ eb = mm::BClassOO.new
773
+ proxy1 = RGen::MetamodelBuilder::MMProxy.new
774
+ proxy2 = RGen::MetamodelBuilder::MMProxy.new
775
+ ea.bClass = proxy1
776
+ eb.aClass = proxy2
777
+ assert_equal proxy1, ea.bClass
778
+ assert_equal proxy2, eb.aClass
779
+ # displace proxies
780
+ ea.bClass = eb
781
+ assert_equal eb, ea.bClass
782
+ assert_equal ea, eb.aClass
783
+ # displace by proxy
784
+ ea.bClass = proxy1
785
+ assert_equal proxy1, ea.bClass
786
+ assert_nil eb.aClass
787
+ end
788
+
789
+ def test_proxies_one_to_many
790
+ eo = mm::OneClass.new
791
+ em = mm::ManyClass.new
792
+ proxy1 = RGen::MetamodelBuilder::MMProxy.new
793
+ proxy2 = RGen::MetamodelBuilder::MMProxy.new
794
+ eo.addManyClasses(proxy1)
795
+ assert_equal [proxy1], eo.manyClasses
796
+ em.oneClass = proxy2
797
+ assert_equal proxy2, em.oneClass
798
+ # displace proxies at many side
799
+ # adding em will set em.oneClass to eo and displace the proxy from em.oneClass
800
+ eo.addManyClasses(em)
801
+ assert_equal [proxy1, em], eo.manyClasses
802
+ assert_equal eo, em.oneClass
803
+ eo.removeManyClasses(proxy1)
804
+ assert_equal [em], eo.manyClasses
805
+ assert_equal eo, em.oneClass
806
+ # displace by proxy
807
+ em.oneClass = proxy2
808
+ assert_equal [], eo.manyClasses
809
+ assert_equal proxy2, em.oneClass
810
+ # displace proxies at one side
811
+ em.oneClass = eo
812
+ assert_equal [em], eo.manyClasses
813
+ assert_equal eo, em.oneClass
814
+ end
815
+
816
+ def test_proxies_many_to_many
817
+ e1 = mm::AClassMM.new
818
+ e2 = mm::BClassMM.new
819
+ proxy1 = RGen::MetamodelBuilder::MMProxy.new
820
+ proxy2 = RGen::MetamodelBuilder::MMProxy.new
821
+ e1.addBClasses(proxy1)
822
+ e2.addAClasses(proxy2)
823
+ assert_equal [proxy1], e1.bClasses
824
+ assert_equal [proxy2], e2.aClasses
825
+ e1.addBClasses(e2)
826
+ assert_equal [proxy1, e2], e1.bClasses
827
+ assert_equal [proxy2, e1], e2.aClasses
828
+ e1.removeBClasses(proxy1)
829
+ e2.removeAClasses(proxy2)
830
+ assert_equal [e2], e1.bClasses
831
+ assert_equal [e1], e2.aClasses
832
+ end
833
+
834
+ # Multiplicity agnostic convenience methods
835
+
836
+ def test_genericAccess
837
+ e1 = mm::OneClass.new
838
+ e2 = mm::ManyClass.new
839
+ e3 = mm::OneClass.new
840
+ e4 = mm::ManyClass.new
841
+ # use on "many" feature
842
+ e1.setOrAddGeneric("manyClasses", e2)
843
+ assert_equal [e2], e1.manyClasses
844
+ assert_equal [e2], e1.getGeneric("manyClasses")
845
+ assert_equal [e2], e1.getGenericAsArray("manyClasses")
846
+ # use on "one" feature
847
+ e2.setOrAddGeneric("oneClass", e3)
848
+ assert_equal e3, e2.oneClass
849
+ assert_equal e3, e2.getGeneric("oneClass")
850
+ assert_equal [e3], e2.getGenericAsArray("oneClass")
851
+ assert_nil e4.getGeneric("oneClass")
852
+ assert_equal [], e4.getGenericAsArray("oneClass")
853
+ end
854
+
855
+ def test_setNilOrRemoveGeneric
856
+ e1 = mm::OneClass.new
857
+ e2 = mm::ManyClass.new
858
+ e3 = mm::OneClass.new
859
+ # use on "many" feature
860
+ e1.addManyClasses(e2)
861
+ assert_equal [e2], e1.manyClasses
862
+ e1.setNilOrRemoveGeneric("manyClasses", e2)
863
+ assert_equal [], e1.manyClasses
864
+ # use on "one" feature
865
+ e2.oneClass = e3
866
+ assert_equal e3, e2.oneClass
867
+ e2.setNilOrRemoveGeneric("oneClass", e3)
868
+ assert_nil e2.oneClass
869
+ end
870
+
871
+ def test_setNilOrRemoveAllGeneric
872
+ e1 = mm::OneClass.new
873
+ e2 = mm::ManyClass.new
874
+ e3 = mm::OneClass.new
875
+ e4 = mm::ManyClass.new
876
+ # use on "many" feature
877
+ e1.addManyClasses(e2)
878
+ e1.addManyClasses(e4)
879
+ assert_equal [e2, e4], e1.manyClasses
880
+ e1.setNilOrRemoveAllGeneric("manyClasses")
881
+ assert_equal [], e1.manyClasses
882
+ # use on "one" feature
883
+ e2.oneClass = e3
884
+ assert_equal e3, e2.oneClass
885
+ e2.setNilOrRemoveAllGeneric("oneClass")
886
+ assert_nil e2.oneClass
887
+ end
888
+
889
+ def test_abstract
890
+ err = assert_raise StandardError do
891
+ mm::AbstractClass.new
892
+ end
893
+ assert_match /Class (\w+::)+AbstractClass is abstract/, err.message
894
+ end
895
+
896
+ module BadDefaultValueLiteralContainer
897
+ Test1 = proc do
898
+ class BadClass < RGen::MetamodelBuilder::MMBase
899
+ has_attr 'integerWithDefault', Integer, :defaultValueLiteral => "1.1"
900
+ end
901
+ end
902
+ Test2 = proc do
903
+ class BadClass < RGen::MetamodelBuilder::MMBase
904
+ has_attr 'integerWithDefault', Integer, :defaultValueLiteral => "x"
905
+ end
906
+ end
907
+ Test3 = proc do
908
+ class BadClass < RGen::MetamodelBuilder::MMBase
909
+ has_attr 'boolWithDefault', Boolean, :defaultValueLiteral => "1"
910
+ end
911
+ end
912
+ Test4 = proc do
913
+ class BadClass < RGen::MetamodelBuilder::MMBase
914
+ has_attr 'floatWithDefault', Float, :defaultValueLiteral => "1"
915
+ end
916
+ end
917
+ Test5 = proc do
918
+ class BadClass < RGen::MetamodelBuilder::MMBase
919
+ has_attr 'floatWithDefault', Float, :defaultValueLiteral => "true"
920
+ end
921
+ end
922
+ Test6 = proc do
923
+ class BadClass < RGen::MetamodelBuilder::MMBase
924
+ kindType = RGen::MetamodelBuilder::DataTypes::Enum.new([:simple, :extended])
925
+ has_attr 'enumWithDefault', kindType, :defaultValueLiteral => "xxx"
926
+ end
927
+ end
928
+ Test7 = proc do
929
+ class BadClass < RGen::MetamodelBuilder::MMBase
930
+ kindType = RGen::MetamodelBuilder::DataTypes::Enum.new([:simple, :extended])
931
+ has_attr 'enumWithDefault', kindType, :defaultValueLiteral => "7"
932
+ end
933
+ end
934
+ Test8 = proc do
935
+ class BadClass < RGen::MetamodelBuilder::MMBase
936
+ has_attr 'longWithDefault', Integer, :defaultValueLiteral => "1.1"
937
+ end
938
+ end
939
+ end
940
+
941
+ def test_bad_default_value_literal
942
+ err = assert_raise StandardError do
943
+ BadDefaultValueLiteralContainer::Test1.call
944
+ end
945
+ assert_equal "Property integerWithDefault can not take value 1.1, expected an Integer", err.message
946
+ err = assert_raise StandardError do
947
+ BadDefaultValueLiteralContainer::Test2.call
948
+ end
949
+ assert_equal "Property integerWithDefault can not take value x, expected an Integer", err.message
950
+ err = assert_raise StandardError do
951
+ BadDefaultValueLiteralContainer::Test3.call
952
+ end
953
+ assert_equal "Property boolWithDefault can not take value 1, expected true or false", err.message
954
+ err = assert_raise StandardError do
955
+ BadDefaultValueLiteralContainer::Test4.call
956
+ end
957
+ assert_equal "Property floatWithDefault can not take value 1, expected a Float", err.message
958
+ err = assert_raise StandardError do
959
+ BadDefaultValueLiteralContainer::Test5.call
960
+ end
961
+ assert_equal "Property floatWithDefault can not take value true, expected a Float", err.message
962
+ err = assert_raise StandardError do
963
+ BadDefaultValueLiteralContainer::Test6.call
964
+ end
965
+ assert_equal "Property enumWithDefault can not take value xxx, expected one of :simple, :extended", err.message
966
+ err = assert_raise StandardError do
967
+ BadDefaultValueLiteralContainer::Test7.call
968
+ end
969
+ assert_equal "Property enumWithDefault can not take value 7, expected one of :simple, :extended", err.message
970
+ err = assert_raise StandardError do
971
+ BadDefaultValueLiteralContainer::Test8.call
972
+ end
973
+ assert_equal "Property longWithDefault can not take value 1.1, expected an Integer", err.message
974
+ end
975
+
976
+ def test_isset_set_to_nil
977
+ e = mm::SimpleClass.new
978
+ assert_respond_to e, :name
979
+ assert !e.eIsSet(:name)
980
+ assert !e.eIsSet("name")
981
+ e.name = nil
982
+ assert e.eIsSet(:name)
983
+ end
984
+
985
+ def test_isset_set_to_default
986
+ e = mm::SimpleClass.new
987
+ assert !e.eIsSet(:stringWithDefault)
988
+ # set the default value
989
+ e.name = "xtest"
990
+ assert e.eIsSet(:name)
991
+ end
992
+
993
+ def test_isset_many_add
994
+ e = mm::ManyAttrClass.new
995
+ assert_equal [], e.literals
996
+ assert !e.eIsSet(:literals)
997
+ e.addLiterals("x")
998
+ assert e.eIsSet(:literals)
999
+ end
1000
+
1001
+ def test_isset_many_remove
1002
+ e = mm::ManyAttrClass.new
1003
+ assert_equal [], e.literals
1004
+ assert !e.eIsSet(:literals)
1005
+ # removing a value which is not there
1006
+ e.removeLiterals("x")
1007
+ assert e.eIsSet(:literals)
1008
+ end
1009
+
1010
+ def test_isset_ref
1011
+ ac = mm::AClassOO.new
1012
+ bc = mm::BClassOO.new
1013
+ assert !bc.eIsSet(:aClass)
1014
+ assert !ac.eIsSet(:bClass)
1015
+ bc.aClass = ac
1016
+ assert bc.eIsSet(:aClass)
1017
+ assert ac.eIsSet(:bClass)
1018
+ end
1019
+
1020
+ def test_isset_ref_many
1021
+ ac = mm::AClassMM.new
1022
+ bc = mm::BClassMM.new
1023
+ assert !bc.eIsSet(:aClasses)
1024
+ assert !ac.eIsSet(:bClasses)
1025
+ bc.aClasses = [ac]
1026
+ assert bc.eIsSet(:aClasses)
1027
+ assert ac.eIsSet(:bClasses)
1028
+ end
1029
+
1030
+ def test_unset_nil
1031
+ e = mm::SimpleClass.new
1032
+ e.name = nil
1033
+ assert e.eIsSet(:name)
1034
+ e.eUnset(:name)
1035
+ assert !e.eIsSet(:name)
1036
+ end
1037
+
1038
+ def test_unset_string
1039
+ e = mm::SimpleClass.new
1040
+ e.name = "someone"
1041
+ assert e.eIsSet(:name)
1042
+ e.eUnset(:name)
1043
+ assert !e.eIsSet(:name)
1044
+ end
1045
+
1046
+ def test_unset_ref
1047
+ ac = mm::AClassOO.new
1048
+ bc = mm::BClassOO.new
1049
+ bc.aClass = ac
1050
+ assert bc.eIsSet(:aClass)
1051
+ assert ac.eIsSet(:bClass)
1052
+ assert_equal bc, ac.bClass
1053
+ bc.eUnset(:aClass)
1054
+ assert_nil bc.aClass
1055
+ assert_nil ac.bClass
1056
+ assert !bc.eIsSet(:aClass)
1057
+ # opposite ref is nil but still "set"
1058
+ assert ac.eIsSet(:bClass)
1059
+ end
1060
+
1061
+ def test_unset_ref_many
1062
+ ac = mm::AClassMM.new
1063
+ bc = mm::BClassMM.new
1064
+ bc.aClasses = [ac]
1065
+ assert bc.eIsSet(:aClasses)
1066
+ assert ac.eIsSet(:bClasses)
1067
+ assert_equal [bc], ac.bClasses
1068
+ bc.eUnset(:aClasses)
1069
+ assert_equal [], bc.aClasses
1070
+ assert_equal [], ac.bClasses
1071
+ assert !bc.eIsSet(:aClasses)
1072
+ # opposite ref is empty but still "set"
1073
+ assert ac.eIsSet(:bClasses)
1074
+ end
1075
+
1076
+ def test_unset_marshal
1077
+ e = mm::SimpleClass.new
1078
+ e.name = "someone"
1079
+ e.eUnset(:name)
1080
+ e2 = Marshal.load(Marshal.dump(e))
1081
+ assert e.object_id != e2.object_id
1082
+ assert !e2.eIsSet(:name)
1083
+ end
1084
+
1085
+ def test_conainer_one_uni
1086
+ a = mm::ContainerClass.new
1087
+ b = mm::ContainedClass.new
1088
+ c = mm::ContainedClass.new
1089
+ assert_equal [], a.eContents
1090
+ assert_equal [], a.eAllContents
1091
+ assert_nil b.eContainer
1092
+ assert_nil b.eContainingFeature
1093
+ a.oneChildUni = b
1094
+ assert_equal a, b.eContainer
1095
+ assert_equal :oneChildUni, b.eContainingFeature
1096
+ assert_equal [b], a.eContents
1097
+ assert_equal [b], a.eAllContents
1098
+ a.oneChildUni = c
1099
+ assert_nil b.eContainer
1100
+ assert_nil b.eContainingFeature
1101
+ assert_equal a, c.eContainer
1102
+ assert_equal :oneChildUni, c.eContainingFeature
1103
+ assert_equal [c], a.eContents
1104
+ assert_equal [c], a.eAllContents
1105
+ a.oneChildUni = nil
1106
+ assert_nil c.eContainer
1107
+ assert_nil c.eContainingFeature
1108
+ assert_equal [], a.eContents
1109
+ assert_equal [], a.eAllContents
1110
+ end
1111
+
1112
+ def test_container_many_uni
1113
+ a = mm::ContainerClass.new
1114
+ b = mm::ContainedClass.new
1115
+ c = mm::ContainedClass.new
1116
+ assert_equal [], a.eContents
1117
+ assert_equal [], a.eAllContents
1118
+ a.addManyChildUni(b)
1119
+ assert_equal a, b.eContainer
1120
+ assert_equal :manyChildUni, b.eContainingFeature
1121
+ assert_equal [b], a.eContents
1122
+ assert_equal [b], a.eAllContents
1123
+ a.addManyChildUni(c)
1124
+ assert_equal a, c.eContainer
1125
+ assert_equal :manyChildUni, c.eContainingFeature
1126
+ assert_equal [b, c], a.eContents
1127
+ assert_equal [b, c], a.eAllContents
1128
+ a.removeManyChildUni(b)
1129
+ assert_nil b.eContainer
1130
+ assert_nil b.eContainingFeature
1131
+ assert_equal a, c.eContainer
1132
+ assert_equal :manyChildUni, c.eContainingFeature
1133
+ assert_equal [c], a.eContents
1134
+ assert_equal [c], a.eAllContents
1135
+ a.removeManyChildUni(c)
1136
+ assert_nil c.eContainer
1137
+ assert_nil c.eContainingFeature
1138
+ assert_equal [], a.eContents
1139
+ assert_equal [], a.eAllContents
1140
+ end
1141
+
1142
+ def test_conainer_one_bi
1143
+ a = mm::ContainerClass.new
1144
+ b = mm::ContainedClass.new
1145
+ c = mm::ContainerClass.new
1146
+ d = mm::ContainedClass.new
1147
+ a.oneChild = b
1148
+ assert_equal a, b.eContainer
1149
+ assert_equal :oneChild, b.eContainingFeature
1150
+ assert_equal [b], a.eContents
1151
+ assert_equal [b], a.eAllContents
1152
+ c.oneChild = d
1153
+ assert_equal c, d.eContainer
1154
+ assert_equal :oneChild, d.eContainingFeature
1155
+ assert_equal [d], c.eContents
1156
+ assert_equal [d], c.eAllContents
1157
+ a.oneChild = d
1158
+ assert_nil b.eContainer
1159
+ assert_nil b.eContainingFeature
1160
+ assert_equal a, d.eContainer
1161
+ assert_equal :oneChild, d.eContainingFeature
1162
+ assert_equal [d], a.eContents
1163
+ assert_equal [d], a.eAllContents
1164
+ assert_equal [], c.eContents
1165
+ assert_equal [], c.eAllContents
1166
+ end
1167
+
1168
+ def test_conainer_one_bi_rev
1169
+ a = mm::ContainerClass.new
1170
+ b = mm::ContainedClass.new
1171
+ c = mm::ContainerClass.new
1172
+ d = mm::ContainedClass.new
1173
+ a.oneChild = b
1174
+ assert_equal a, b.eContainer
1175
+ assert_equal :oneChild, b.eContainingFeature
1176
+ assert_equal [b], a.eContents
1177
+ assert_equal [b], a.eAllContents
1178
+ c.oneChild = d
1179
+ assert_equal c, d.eContainer
1180
+ assert_equal :oneChild, d.eContainingFeature
1181
+ assert_equal [d], c.eContents
1182
+ assert_equal [d], c.eAllContents
1183
+ d.parentOne = a
1184
+ assert_nil b.eContainer
1185
+ assert_nil b.eContainingFeature
1186
+ assert_equal a, d.eContainer
1187
+ assert_equal :oneChild, d.eContainingFeature
1188
+ assert_equal [d], a.eContents
1189
+ assert_equal [d], a.eAllContents
1190
+ assert_equal [], c.eContents
1191
+ assert_equal [], c.eAllContents
1192
+ end
1193
+
1194
+ def test_conainer_one_bi_nil
1195
+ a = mm::ContainerClass.new
1196
+ b = mm::ContainedClass.new
1197
+ a.oneChild = b
1198
+ assert_equal a, b.eContainer
1199
+ assert_equal :oneChild, b.eContainingFeature
1200
+ assert_equal [b], a.eContents
1201
+ assert_equal [b], a.eAllContents
1202
+ a.oneChild = nil
1203
+ assert_nil b.eContainer
1204
+ assert_nil b.eContainingFeature
1205
+ assert_equal [], a.eContents
1206
+ assert_equal [], a.eAllContents
1207
+ end
1208
+
1209
+ def test_conainer_one_bi_nil_rev
1210
+ a = mm::ContainerClass.new
1211
+ b = mm::ContainedClass.new
1212
+ a.oneChild = b
1213
+ assert_equal a, b.eContainer
1214
+ assert_equal :oneChild, b.eContainingFeature
1215
+ assert_equal [b], a.eContents
1216
+ assert_equal [b], a.eAllContents
1217
+ b.parentOne = nil
1218
+ assert_nil b.eContainer
1219
+ assert_nil b.eContainingFeature
1220
+ assert_equal [], a.eContents
1221
+ assert_equal [], a.eAllContents
1222
+ end
1223
+
1224
+ def test_container_many_bi
1225
+ a = mm::ContainerClass.new
1226
+ b = mm::ContainedClass.new
1227
+ c = mm::ContainedClass.new
1228
+ a.addManyChild(b)
1229
+ a.addManyChild(c)
1230
+ assert_equal a, b.eContainer
1231
+ assert_equal :manyChild, b.eContainingFeature
1232
+ assert_equal a, c.eContainer
1233
+ assert_equal :manyChild, c.eContainingFeature
1234
+ assert_equal [b, c], a.eContents
1235
+ assert_equal [b, c], a.eAllContents
1236
+ a.removeManyChild(b)
1237
+ assert_nil b.eContainer
1238
+ assert_nil b.eContainingFeature
1239
+ assert_equal [c], a.eContents
1240
+ assert_equal [c], a.eAllContents
1241
+ end
1242
+
1243
+ def test_conainer_many_bi_steal
1244
+ a = mm::ContainerClass.new
1245
+ b = mm::ContainedClass.new
1246
+ c = mm::ContainedClass.new
1247
+ d = mm::ContainerClass.new
1248
+ a.addManyChild(b)
1249
+ a.addManyChild(c)
1250
+ assert_equal a, b.eContainer
1251
+ assert_equal :manyChild, b.eContainingFeature
1252
+ assert_equal a, c.eContainer
1253
+ assert_equal :manyChild, c.eContainingFeature
1254
+ assert_equal [b, c], a.eContents
1255
+ assert_equal [b, c], a.eAllContents
1256
+ d.addManyChild(b)
1257
+ assert_equal d, b.eContainer
1258
+ assert_equal :manyChild, b.eContainingFeature
1259
+ assert_equal [c], a.eContents
1260
+ assert_equal [c], a.eAllContents
1261
+ assert_equal [b], d.eContents
1262
+ assert_equal [b], d.eAllContents
1263
+ end
1264
+
1265
+ def test_conainer_many_bi_steal_rev
1266
+ a = mm::ContainerClass.new
1267
+ b = mm::ContainedClass.new
1268
+ c = mm::ContainedClass.new
1269
+ d = mm::ContainerClass.new
1270
+ a.addManyChild(b)
1271
+ a.addManyChild(c)
1272
+ assert_equal a, b.eContainer
1273
+ assert_equal :manyChild, b.eContainingFeature
1274
+ assert_equal a, c.eContainer
1275
+ assert_equal :manyChild, c.eContainingFeature
1276
+ assert_equal [b, c], a.eContents
1277
+ assert_equal [b, c], a.eAllContents
1278
+ b.parentMany = d
1279
+ assert_equal d, b.eContainer
1280
+ assert_equal :manyChild, b.eContainingFeature
1281
+ assert_equal [c], a.eContents
1282
+ assert_equal [c], a.eAllContents
1283
+ assert_equal [b], d.eContents
1284
+ assert_equal [b], d.eAllContents
1285
+ end
1286
+
1287
+ def test_all_contents
1288
+ a = mm::ContainerClass.new
1289
+ b = mm::NestedContainerClass.new
1290
+ c = mm::ContainedClass.new
1291
+ a.oneChildUni = b
1292
+ b.oneChildUni = c
1293
+ assert_equal [b, c], a.eAllContents
1294
+ end
1295
+
1296
+ def test_all_contents_with_block
1297
+ a = mm::ContainerClass.new
1298
+ b = mm::NestedContainerClass.new
1299
+ c = mm::ContainedClass.new
1300
+ a.oneChildUni = b
1301
+ b.oneChildUni = c
1302
+ yielded = []
1303
+ a.eAllContents do |e|
1304
+ yielded << e
1305
+ end
1306
+ assert_equal [b, c], yielded
1307
+ end
1308
+
1309
+ def test_all_contents_prune
1310
+ a = mm::ContainerClass.new
1311
+ b = mm::NestedContainerClass.new
1312
+ c = mm::ContainedClass.new
1313
+ a.oneChildUni = b
1314
+ b.oneChildUni = c
1315
+ yielded = []
1316
+ a.eAllContents do |e|
1317
+ yielded << e
1318
+ :prune
1319
+ end
1320
+ assert_equal [b], yielded
1321
+ end
1322
+
1323
+ def test_container_generic
1324
+ a = mm::ContainerClass.new
1325
+ assert_nothing_raised do
1326
+ a.oneChild = RGen::MetamodelBuilder::MMGeneric.new
1327
+ end
1328
+ end
1329
+
1330
+ def test_opposite_assoc_on_first_write
1331
+ ac = mm::OppositeRefAssocA.new
1332
+ bc = mm::OppositeRefAssocB.new
1333
+
1334
+ # no access to 'aClass' or 'bClass' methods before
1335
+ # test if on-demand metamodel building creates opposite ref association on first write
1336
+ bc.aClass = ac
1337
+ assert_equal ac, bc.aClass
1338
+ assert_equal bc, ac.bClass
1339
+ end
1340
+
1341
+ def test_clear_by_array_assignment
1342
+ oc1 = mm::OneClass.new
1343
+ mc1 = mm::ManyClass.new
1344
+ mc2 = mm::ManyClass.new
1345
+ mc3 = mm::ManyClass.new
1346
+
1347
+ oc1.manyClasses = [mc1, mc2]
1348
+ assert_equal [mc1, mc2], oc1.manyClasses
1349
+ oc1.manyClasses = []
1350
+ assert_equal [], oc1.manyClasses
1351
+ end
1352
+
1353
+ def test_clear_by_array_assignment_uni
1354
+ a = mm::ContainerClass.new
1355
+ b = mm::ContainedClass.new
1356
+ c = mm::ContainedClass.new
1357
+
1358
+ a.manyChildUni = [b, c]
1359
+ assert_equal [b, c], a.manyChildUni
1360
+ a.manyChildUni = []
1361
+ assert_equal [], a.manyChildUni
1362
+ end
1363
+
1364
+ def test_disconnectContainer_one_uni
1365
+ a = mm::ContainerClass.new
1366
+ b = mm::ContainedClass.new
1367
+ a.oneChildUni = b
1368
+ b.disconnectContainer
1369
+ assert_nil a.oneChildUni
1370
+ end
1371
+
1372
+ def test_disconnectContainer_one
1373
+ a = mm::ContainerClass.new
1374
+ b = mm::ContainedClass.new
1375
+ a.oneChild = b
1376
+ b.disconnectContainer
1377
+ assert_nil a.oneChild
1378
+ assert_nil b.parentOne
1379
+ end
1380
+
1381
+ def test_disconnectContainer_many_uni
1382
+ a = mm::ContainerClass.new
1383
+ b = mm::ContainedClass.new
1384
+ c = mm::ContainedClass.new
1385
+ a.addManyChildUni(b)
1386
+ a.addManyChildUni(c)
1387
+ b.disconnectContainer
1388
+ assert_equal [c], a.manyChildUni
1389
+ end
1390
+
1391
+ def test_disconnectContainer_many
1392
+ a = mm::ContainerClass.new
1393
+ b = mm::ContainedClass.new
1394
+ c = mm::ContainedClass.new
1395
+ a.addManyChild(b)
1396
+ a.addManyChild(c)
1397
+ b.disconnectContainer
1398
+ assert_nil b.parentMany
1399
+ assert_equal [c], a.manyChild
1400
+ end
1401
+
1402
+ # Duplicate Containment Tests
1403
+ #
1404
+ # Testing that no element is contained in two different containers at a time.
1405
+ # This must also work for uni-directional containments as well as
1406
+ # for containments via different roles.
1407
+
1408
+ # here the bi-dir reference disconnects from the previous container
1409
+ def test_duplicate_containment_bidir_samerole_one
1410
+ a1 = mm::ContainerClass.new
1411
+ a2 = mm::ContainerClass.new
1412
+ b = mm::ContainedClass.new
1413
+ a1.oneChild = b
1414
+ a2.oneChild = b
1415
+ assert_nil a1.oneChild
1416
+ end
1417
+
1418
+ # here the bi-dir reference disconnects from the previous container
1419
+ def test_duplicate_containment_bidir_samerole_many
1420
+ a1 = mm::ContainerClass.new
1421
+ a2 = mm::ContainerClass.new
1422
+ b = mm::ContainedClass.new
1423
+ a1.addManyChild(b)
1424
+ a2.addManyChild(b)
1425
+ assert_equal [], a1.manyChild
1426
+ end
1427
+
1428
+ def test_duplicate_containment_unidir_samerole_one
1429
+ a1 = mm::ContainerClass.new
1430
+ a2 = mm::ContainerClass.new
1431
+ b = mm::ContainedClass.new
1432
+ a1.oneChildUni = b
1433
+ a2.oneChildUni = b
1434
+ assert_nil a1.oneChildUni
1435
+ end
1436
+
1437
+ def test_duplicate_containment_unidir_samerole_many
1438
+ a1 = mm::ContainerClass.new
1439
+ a2 = mm::ContainerClass.new
1440
+ b = mm::ContainedClass.new
1441
+ a1.addManyChildUni(b)
1442
+ a2.addManyChildUni(b)
1443
+ assert_equal [], a1.manyChildUni
1444
+ end
1445
+
1446
+ def test_duplicate_containment_bidir_otherrole_one
1447
+ a1 = mm::ContainerClass.new
1448
+ a2 = mm::ContainerClass.new
1449
+ b = mm::ContainedClass.new
1450
+ a1.oneChild = b
1451
+ a2.oneChild2 = b
1452
+ assert_nil a1.oneChild
1453
+ end
1454
+
1455
+ def test_duplicate_containment_bidir_otherrole_many
1456
+ a1 = mm::ContainerClass.new
1457
+ a2 = mm::ContainerClass.new
1458
+ b = mm::ContainedClass.new
1459
+ a1.addManyChild(b)
1460
+ a2.addManyChild2(b)
1461
+ assert_equal [], a1.manyChild
1462
+ end
1463
+
1464
+ def test_duplicate_containment_unidir_otherrole_one
1465
+ a1 = mm::ContainerClass.new
1466
+ a2 = mm::ContainerClass.new
1467
+ b = mm::ContainedClass.new
1468
+ a1.oneChildUni = b
1469
+ a2.oneChildUni2 = b
1470
+ assert_nil a1.oneChildUni
1471
+ end
1472
+
1473
+ def test_duplicate_containment_unidir_otherrole_many
1474
+ a1 = mm::ContainerClass.new
1475
+ a2 = mm::ContainerClass.new
1476
+ b = mm::ContainedClass.new
1477
+ a1.addManyChildUni(b)
1478
+ a2.addManyChildUni2(b)
1479
+ assert_equal [], a1.manyChildUni
1480
+ end
1481
+
1482
+ end