ceedling 0.12.2 → 0.13.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (438) hide show
  1. data/.gitignore +5 -14
  2. data/.gitmodules +9 -0
  3. data/.rspec +1 -0
  4. data/Gemfile +10 -2
  5. data/README.md +97 -67
  6. data/{new_project_template → assets}/project.yml +0 -0
  7. data/{new_project_template → assets}/rakefile.rb +0 -0
  8. data/bin/ceedling +77 -44
  9. data/ceedling.gemspec +18 -5
  10. data/config/test_environment.rb +12 -0
  11. data/docs/CeedlingLogo.png +0 -0
  12. data/docs/CeedlingPacket.md +1934 -0
  13. data/docs/CeedlingPacket.odt +0 -0
  14. data/docs/CeedlingPacket.pdf +0 -0
  15. data/examples/temp_sensor/project.yml +71 -74
  16. data/examples/temp_sensor/rakefile.rb +3 -5
  17. data/examples/temp_sensor/src/AdcConductor.h +2 -0
  18. data/examples/temp_sensor/src/TemperatureCalculator.h +2 -0
  19. data/examples/temp_sensor/src/Types.h +0 -13
  20. data/examples/temp_sensor/src/UsartBaudRateRegisterCalculator.h +2 -0
  21. data/examples/temp_sensor/src/UsartHardware.c +0 -12
  22. data/examples/temp_sensor/src/UsartHardware.h +0 -1
  23. data/examples/temp_sensor/test/{test_AdcConductor.c → TestAdcConductor.c} +0 -0
  24. data/examples/temp_sensor/test/{test_AdcHardware.c → TestAdcHardware.c} +0 -0
  25. data/examples/temp_sensor/test/{test_AdcModel.c → TestAdcModel.c} +0 -0
  26. data/examples/temp_sensor/test/{test_Executor.c → TestExecutor.c} +0 -0
  27. data/examples/temp_sensor/test/{test_Main.c → TestMain.c} +0 -0
  28. data/examples/temp_sensor/test/{test_Model.c → TestModel.c} +0 -0
  29. data/examples/temp_sensor/test/{test_TaskScheduler.c → TestTaskScheduler.c} +0 -0
  30. data/examples/temp_sensor/test/{test_TemperatureCalculator.c → TestTemperatureCalculator.c} +0 -0
  31. data/examples/temp_sensor/test/{test_TemperatureFilter.c → TestTemperatureFilter.c} +0 -2
  32. data/examples/temp_sensor/test/{test_TimerConductor.c → TestTimerConductor.c} +0 -0
  33. data/examples/temp_sensor/test/{test_TimerHardware.c → TestTimerHardware.c} +0 -0
  34. data/examples/temp_sensor/test/{test_TimerModel.c → TestTimerModel.c} +0 -0
  35. data/examples/temp_sensor/test/{test_UsartBaudRateRegisterCalculator.c → TestUsartBaudRateRegisterCalculator.c} +0 -0
  36. data/examples/temp_sensor/test/{test_UsartConductor.c → TestUsartConductor.c} +0 -0
  37. data/examples/temp_sensor/test/{test_UsartHardware.c → TestUsartHardware.c} +0 -20
  38. data/examples/temp_sensor/test/{test_UsartModel.c → TestUsartModel.c} +0 -0
  39. data/examples/temp_sensor/test/support/UnityHelper.c +7 -5
  40. data/examples/temp_sensor/test/support/UnityHelper.h +5 -5
  41. data/{new_project_template/vendor/ceedling/lib → lib}/build_invoker_utils.rb +0 -0
  42. data/{new_project_template/vendor/ceedling/lib → lib}/cacheinator.rb +0 -0
  43. data/{new_project_template/vendor/ceedling/lib → lib}/cacheinator_helper.rb +0 -0
  44. data/lib/ceedling.rb +16 -4
  45. data/lib/ceedling/version.rb +4 -4
  46. data/lib/ceedling/version.rb.erb +1 -1
  47. data/{new_project_template/vendor/ceedling/lib → lib}/cmock_builder.rb +0 -0
  48. data/{new_project_template/vendor/ceedling/lib → lib}/configurator.rb +0 -0
  49. data/{new_project_template/vendor/ceedling/lib → lib}/configurator_builder.rb +0 -0
  50. data/{new_project_template/vendor/ceedling/lib → lib}/configurator_plugins.rb +0 -0
  51. data/{new_project_template/vendor/ceedling/lib → lib}/configurator_setup.rb +0 -0
  52. data/{new_project_template/vendor/ceedling/lib → lib}/configurator_validator.rb +0 -0
  53. data/{new_project_template/vendor/ceedling/lib → lib}/constants.rb +0 -0
  54. data/{new_project_template/vendor/ceedling/lib → lib}/defaults.rb +2 -0
  55. data/{new_project_template/vendor/ceedling/lib → lib}/dependinator.rb +0 -0
  56. data/{new_project_template/vendor/ceedling/lib → lib}/erb_wrapper.rb +0 -0
  57. data/{new_project_template/vendor/ceedling/lib → lib}/file_finder.rb +0 -0
  58. data/{new_project_template/vendor/ceedling/lib → lib}/file_finder_helper.rb +0 -0
  59. data/{new_project_template/vendor/ceedling/lib → lib}/file_path_utils.rb +0 -0
  60. data/{new_project_template/vendor/ceedling/lib → lib}/file_system_utils.rb +0 -0
  61. data/{new_project_template/vendor/ceedling/lib → lib}/file_system_wrapper.rb +0 -0
  62. data/{new_project_template/vendor/ceedling/lib → lib}/file_wrapper.rb +0 -0
  63. data/{new_project_template/vendor/ceedling/lib → lib}/flaginator.rb +0 -0
  64. data/{new_project_template/vendor/ceedling/lib → lib}/generator.rb +0 -0
  65. data/{new_project_template/vendor/ceedling/lib → lib}/generator_helper.rb +0 -0
  66. data/{new_project_template/vendor/ceedling/lib → lib}/generator_test_results.rb +0 -0
  67. data/{new_project_template/vendor/ceedling/lib → lib}/generator_test_results_sanity_checker.rb +0 -0
  68. data/{new_project_template/vendor/ceedling/lib → lib}/generator_test_runner.rb +0 -0
  69. data/{new_project_template/vendor/ceedling/lib → lib}/loginator.rb +0 -0
  70. data/{new_project_template/vendor/ceedling/lib → lib}/makefile.rb +0 -0
  71. data/{new_project_template/vendor/ceedling/lib → lib}/objects.yml +0 -2
  72. data/lib/par_map.rb +19 -0
  73. data/{new_project_template/vendor/ceedling/lib → lib}/plugin.rb +0 -0
  74. data/{new_project_template/vendor/ceedling/lib → lib}/plugin_builder.rb +0 -0
  75. data/{new_project_template/vendor/ceedling/lib → lib}/plugin_manager.rb +20 -8
  76. data/{new_project_template/vendor/ceedling/lib → lib}/plugin_manager_helper.rb +0 -0
  77. data/{new_project_template/vendor/ceedling/lib → lib}/plugin_reportinator.rb +0 -0
  78. data/{new_project_template/vendor/ceedling/lib → lib}/plugin_reportinator_helper.rb +0 -0
  79. data/{new_project_template/vendor/ceedling/lib → lib}/preprocessinator.rb +0 -0
  80. data/lib/preprocessinator_extractor.rb +30 -0
  81. data/{new_project_template/vendor/ceedling/lib → lib}/preprocessinator_file_handler.rb +0 -0
  82. data/{new_project_template/vendor/ceedling/lib → lib}/preprocessinator_helper.rb +0 -0
  83. data/{new_project_template/vendor/ceedling/lib → lib}/preprocessinator_includes_handler.rb +0 -0
  84. data/{new_project_template/vendor/ceedling/lib → lib}/project_config_manager.rb +0 -0
  85. data/{new_project_template/vendor/ceedling/lib → lib}/project_file_loader.rb +0 -0
  86. data/{new_project_template/vendor/ceedling/lib → lib}/rake_utils.rb +0 -0
  87. data/{new_project_template/vendor/ceedling/lib → lib}/rake_wrapper.rb +0 -0
  88. data/{new_project_template/vendor/ceedling/lib → lib}/rakefile.rb +0 -0
  89. data/{new_project_template/vendor/ceedling/lib → lib}/release_invoker.rb +0 -0
  90. data/{new_project_template/vendor/ceedling/lib → lib}/release_invoker_helper.rb +0 -0
  91. data/{new_project_template/vendor/ceedling/lib → lib}/reportinator.rb +0 -0
  92. data/{new_project_template/vendor/ceedling/lib → lib}/rules_cmock.rake +0 -0
  93. data/{new_project_template/vendor/ceedling/lib → lib}/rules_preprocess.rake +0 -0
  94. data/{new_project_template/vendor/ceedling/lib → lib}/rules_release.rake +0 -0
  95. data/{new_project_template/vendor/ceedling/lib → lib}/rules_release_deep_dependencies.rake +0 -0
  96. data/{new_project_template/vendor/ceedling/lib → lib}/rules_tests.rake +0 -0
  97. data/{new_project_template/vendor/ceedling/lib → lib}/rules_tests_deep_dependencies.rake +0 -0
  98. data/{new_project_template/vendor/ceedling/lib → lib}/setupinator.rb +0 -0
  99. data/{new_project_template/vendor/ceedling/lib → lib}/stream_wrapper.rb +0 -0
  100. data/{new_project_template/vendor/ceedling/lib → lib}/streaminator.rb +0 -0
  101. data/{new_project_template/vendor/ceedling/lib → lib}/streaminator_helper.rb +0 -0
  102. data/{new_project_template/vendor/ceedling/lib → lib}/system_utils.rb +0 -0
  103. data/{new_project_template/vendor/ceedling/lib → lib}/system_wrapper.rb +0 -0
  104. data/{new_project_template/vendor/ceedling/lib → lib}/task_invoker.rb +7 -3
  105. data/{new_project_template/vendor/ceedling/lib → lib}/tasks_base.rake +0 -0
  106. data/{new_project_template/vendor/ceedling/lib → lib}/tasks_filesystem.rake +0 -0
  107. data/{new_project_template/vendor/ceedling/lib → lib}/tasks_release.rake +0 -0
  108. data/{new_project_template/vendor/ceedling/lib → lib}/tasks_release_deep_dependencies.rake +0 -0
  109. data/{new_project_template/vendor/ceedling/lib → lib}/tasks_tests.rake +0 -0
  110. data/{new_project_template/vendor/ceedling/lib → lib}/tasks_tests_deep_dependencies.rake +0 -0
  111. data/{new_project_template/vendor/ceedling/lib → lib}/tasks_vendor.rake +0 -0
  112. data/{new_project_template/vendor/ceedling/lib → lib}/test_includes_extractor.rb +0 -0
  113. data/{new_project_template/vendor/ceedling/lib → lib}/test_invoker.rb +0 -0
  114. data/{new_project_template/vendor/ceedling/lib → lib}/test_invoker_helper.rb +0 -0
  115. data/{new_project_template/vendor/ceedling/lib → lib}/tool_executor.rb +0 -0
  116. data/{new_project_template/vendor/ceedling/lib → lib}/tool_executor_helper.rb +0 -0
  117. data/{new_project_template/vendor/ceedling/lib → lib}/verbosinator.rb +0 -0
  118. data/{new_project_template/vendor/ceedling/lib → lib}/yaml_wrapper.rb +0 -0
  119. data/{new_project_template/vendor/ceedling/plugins → plugins}/bullseye/bullseye.rake +0 -0
  120. data/{new_project_template/vendor/ceedling/plugins → plugins}/bullseye/bullseye.rb +0 -0
  121. data/{new_project_template/vendor/ceedling/plugins → plugins}/bullseye/defaults.yml +0 -0
  122. data/{new_project_template/vendor/ceedling/plugins → plugins}/bullseye/readme.txt +0 -0
  123. data/{new_project_template/vendor/ceedling/plugins → plugins}/bullseye/template.erb +0 -0
  124. data/{new_project_template/vendor/ceedling/plugins → plugins}/gcov/defaults.yml +0 -0
  125. data/{new_project_template/vendor/ceedling/plugins → plugins}/gcov/gcov.rake +0 -0
  126. data/{new_project_template/vendor/ceedling/plugins → plugins}/gcov/gcov.rb +0 -0
  127. data/{new_project_template/vendor/ceedling/plugins → plugins}/gcov/readme.txt +0 -0
  128. data/{new_project_template/vendor/ceedling/plugins → plugins}/gcov/template.erb +0 -0
  129. data/{new_project_template/vendor/ceedling/plugins → plugins}/module_generator/config/module_generator.yml +0 -0
  130. data/{new_project_template/vendor/ceedling/plugins → plugins}/module_generator/lib/module_generator.rb +0 -0
  131. data/{new_project_template/vendor/ceedling/plugins → plugins}/module_generator/module_generator.rake +0 -0
  132. data/{new_project_template/vendor/ceedling/plugins → plugins}/stdout_ide_tests_report/config/stdout_ide_tests_report.yml +0 -0
  133. data/{new_project_template/vendor/ceedling/plugins → plugins}/stdout_ide_tests_report/lib/stdout_ide_tests_report.rb +0 -0
  134. data/{new_project_template/vendor/ceedling/plugins → plugins}/stdout_pretty_tests_report/assets/template.erb +0 -0
  135. data/{new_project_template/vendor/ceedling/plugins → plugins}/stdout_pretty_tests_report/config/stdout_pretty_tests_report.yml +0 -0
  136. data/{new_project_template/vendor/ceedling/plugins → plugins}/stdout_pretty_tests_report/lib/stdout_pretty_tests_report.rb +0 -0
  137. data/{new_project_template/vendor/ceedling/plugins → plugins}/warnings_report/warnings_report.rb +0 -0
  138. data/{new_project_template/vendor/ceedling/plugins → plugins}/xml_tests_report/xml_tests_report.rb +0 -0
  139. data/rakefile.rb +14 -0
  140. data/release/build.info +2 -0
  141. data/{new_project_template/vendor/ceedling/release → release}/version.info +0 -0
  142. data/spec/configurator_builder_spec.rb +7 -0
  143. data/spec/configurator_helper_spec.rb +5 -0
  144. data/spec/configurator_spec.rb +10 -0
  145. data/spec/par_map_spec.rb +57 -0
  146. data/spec/preprocessinator_extractor_spec.rb +46 -0
  147. data/spec/spec_helper.rb +46 -0
  148. data/spec/uncatagorized_specs_spec.rb +8 -0
  149. data/test_graveyard/integration/paths.yml +17 -0
  150. data/test_graveyard/integration/paths_test.rb +80 -0
  151. data/test_graveyard/integration/rake_rules_aux_dependencies_test.rb +75 -0
  152. data/test_graveyard/integration/rake_rules_cmock_test.rb +74 -0
  153. data/test_graveyard/integration/rake_rules_preprocess_test.rb +178 -0
  154. data/test_graveyard/integration/rake_rules_test.rb +268 -0
  155. data/test_graveyard/integration/rake_tasks_test.rb +103 -0
  156. data/test_graveyard/integration_test_helper.rb +34 -0
  157. data/test_graveyard/rakefile_rules.rb +10 -0
  158. data/test_graveyard/rakefile_rules_aux_dependencies.rb +10 -0
  159. data/test_graveyard/rakefile_rules_cmock.rb +10 -0
  160. data/test_graveyard/rakefile_rules_preprocess.rb +10 -0
  161. data/test_graveyard/rakefile_tasks.rb +10 -0
  162. data/test_graveyard/system/file_system_dependencies.yml +20 -0
  163. data/test_graveyard/system/file_system_kitchen_sink.yml +20 -0
  164. data/test_graveyard/system/file_system_mocks.yml +20 -0
  165. data/test_graveyard/system/file_system_preprocess.yml +20 -0
  166. data/test_graveyard/system/file_system_simple.yml +20 -0
  167. data/test_graveyard/system/file_system_test.rb +78 -0
  168. data/test_graveyard/system/mocks/include/a_file.h +2 -0
  169. data/test_graveyard/system/mocks/include/other_stuff.h +2 -0
  170. data/test_graveyard/system/mocks/include/stuff.h +3 -0
  171. data/test_graveyard/system/mocks/source/a_file.c +9 -0
  172. data/test_graveyard/system/mocks/test/test_a_file.c +41 -0
  173. data/test_graveyard/system/mocks/test/test_no_file.c +14 -0
  174. data/test_graveyard/system/project_mocks.yml +43 -0
  175. data/test_graveyard/system/project_mocks_test.rb +38 -0
  176. data/test_graveyard/system/project_simple.yml +36 -0
  177. data/test_graveyard/system/project_simple_test.rb +39 -0
  178. data/test_graveyard/system/rule_mocks_test.rb +44 -0
  179. data/test_graveyard/system/rule_runners_test.rb +44 -0
  180. data/test_graveyard/system/simple/include/other_stuff.h +2 -0
  181. data/test_graveyard/system/simple/include/stuff.h +3 -0
  182. data/test_graveyard/system/simple/source/other_stuff.c +6 -0
  183. data/test_graveyard/system/simple/source/stuff.c +7 -0
  184. data/test_graveyard/system/simple/test/test_other_stuff.c +30 -0
  185. data/test_graveyard/system/simple/test/test_stuff.c +51 -0
  186. data/test_graveyard/system_test_helper.rb +73 -0
  187. data/test_graveyard/test_helper.rb +93 -0
  188. data/test_graveyard/unit/busted/configurator_builder_test.rb +571 -0
  189. data/test_graveyard/unit/busted/configurator_helper_test.rb +234 -0
  190. data/test_graveyard/unit/busted/configurator_test.rb +232 -0
  191. data/test_graveyard/unit/busted/configurator_validator_test.rb +169 -0
  192. data/test_graveyard/unit/busted/deep_merge_fix_test.rb +55 -0
  193. data/test_graveyard/unit/busted/dependinator_test.rb +129 -0
  194. data/test_graveyard/unit/busted/file_finder_helper_test.rb +45 -0
  195. data/test_graveyard/unit/busted/file_finder_test.rb +114 -0
  196. data/test_graveyard/unit/busted/file_path_utils_test.rb +97 -0
  197. data/test_graveyard/unit/busted/file_system_utils_test.rb +21 -0
  198. data/test_graveyard/unit/busted/generator_test.rb +187 -0
  199. data/test_graveyard/unit/busted/generator_test_results_test.rb +129 -0
  200. data/test_graveyard/unit/busted/generator_test_runner_test.rb +478 -0
  201. data/test_graveyard/unit/busted/preprocessinator_file_handler_test.rb +38 -0
  202. data/test_graveyard/unit/busted/preprocessinator_helper_test.rb +156 -0
  203. data/test_graveyard/unit/busted/preprocessinator_includes_handler_test.rb +93 -0
  204. data/test_graveyard/unit/busted/preprocessinator_test.rb +57 -0
  205. data/test_graveyard/unit/busted/project_file_loader_test.rb +142 -0
  206. data/test_graveyard/unit/busted/setupinator_test.rb +45 -0
  207. data/test_graveyard/unit/busted/streaminator_test.rb +49 -0
  208. data/test_graveyard/unit/busted/task_invoker_test.rb +69 -0
  209. data/test_graveyard/unit/busted/test_includes_extractor_test.rb +111 -0
  210. data/test_graveyard/unit/busted/test_invoker_helper_test.rb +62 -0
  211. data/test_graveyard/unit/busted/test_invoker_test.rb +47 -0
  212. data/test_graveyard/unit/busted/tool_executor_helper_test.rb +100 -0
  213. data/test_graveyard/unit/busted/tool_executor_test.rb +351 -0
  214. data/test_graveyard/unit/busted/verbosinator_test.rb +65 -0
  215. data/test_graveyard/unit/preprocessinator_extractor_test.rb +731 -0
  216. data/test_graveyard/unit_test_helper.rb +16 -0
  217. data/vendor/behaviors/Manifest.txt +9 -0
  218. data/vendor/behaviors/Rakefile +19 -0
  219. data/vendor/behaviors/lib/behaviors.rb +76 -0
  220. data/vendor/behaviors/lib/behaviors/reporttask.rb +158 -0
  221. data/vendor/behaviors/test/behaviors_tasks_test.rb +73 -0
  222. data/vendor/behaviors/test/behaviors_test.rb +50 -0
  223. data/vendor/behaviors/test/tasks_test/Rakefile +19 -0
  224. data/vendor/behaviors/test/tasks_test/lib/user.rb +2 -0
  225. data/vendor/behaviors/test/tasks_test/test/user_test.rb +17 -0
  226. data/{new_project_template/vendor/ceedling/vendor → vendor}/c_exception/lib/CException.c +0 -0
  227. data/{new_project_template/vendor/ceedling/vendor → vendor}/c_exception/lib/CException.h +1 -1
  228. data/vendor/c_exception/release/build.info +2 -0
  229. data/{new_project_template/vendor/ceedling/vendor → vendor}/c_exception/release/version.info +0 -0
  230. data/{new_project_template/vendor/ceedling/vendor → vendor}/cmock/config/production_environment.rb +0 -0
  231. data/{new_project_template/vendor/ceedling/vendor → vendor}/cmock/config/test_environment.rb +0 -0
  232. data/{new_project_template/vendor/ceedling/vendor → vendor}/cmock/lib/cmock.rb +0 -0
  233. data/{new_project_template/vendor/ceedling/vendor → vendor}/cmock/lib/cmock_config.rb +3 -3
  234. data/{new_project_template/vendor/ceedling/vendor → vendor}/cmock/lib/cmock_file_writer.rb +0 -0
  235. data/{new_project_template/vendor/ceedling/vendor → vendor}/cmock/lib/cmock_generator.rb +0 -0
  236. data/{new_project_template/vendor/ceedling/vendor → vendor}/cmock/lib/cmock_generator_plugin_array.rb +0 -0
  237. data/{new_project_template/vendor/ceedling/vendor → vendor}/cmock/lib/cmock_generator_plugin_callback.rb +0 -0
  238. data/{new_project_template/vendor/ceedling/vendor → vendor}/cmock/lib/cmock_generator_plugin_cexception.rb +0 -0
  239. data/{new_project_template/vendor/ceedling/vendor → vendor}/cmock/lib/cmock_generator_plugin_expect.rb +0 -0
  240. data/{new_project_template/vendor/ceedling/vendor → vendor}/cmock/lib/cmock_generator_plugin_ignore.rb +14 -4
  241. data/{new_project_template/vendor/ceedling/vendor → vendor}/cmock/lib/cmock_generator_utils.rb +0 -0
  242. data/{new_project_template/vendor/ceedling/vendor → vendor}/cmock/lib/cmock_header_parser.rb +9 -5
  243. data/{new_project_template/vendor/ceedling/vendor → vendor}/cmock/lib/cmock_plugin_manager.rb +0 -0
  244. data/{new_project_template/vendor/ceedling/vendor → vendor}/cmock/lib/cmock_unityhelper_parser.rb +75 -74
  245. data/vendor/cmock/release/build.info +2 -0
  246. data/{new_project_template/vendor/ceedling/vendor → vendor}/cmock/release/version.info +0 -0
  247. data/{new_project_template/vendor/ceedling/vendor → vendor}/cmock/src/cmock.c +0 -0
  248. data/{new_project_template/vendor/ceedling/vendor → vendor}/cmock/src/cmock.h +0 -0
  249. data/vendor/constructor/History.rdoc +19 -0
  250. data/vendor/constructor/README.rdoc +72 -0
  251. data/vendor/constructor/Rakefile +33 -0
  252. data/vendor/constructor/homepage/Notes.txt +27 -0
  253. data/vendor/constructor/homepage/Rakefile +15 -0
  254. data/vendor/constructor/homepage/index.erb +27 -0
  255. data/vendor/constructor/homepage/index.html +36 -0
  256. data/vendor/constructor/homepage/page_header.graffle +0 -0
  257. data/vendor/constructor/homepage/page_header.html +9 -0
  258. data/vendor/constructor/homepage/page_header.png +0 -0
  259. data/vendor/constructor/homepage/sample_code.png +0 -0
  260. data/vendor/constructor/homepage/sample_code.rb +12 -0
  261. data/{new_project_template/vendor/ceedling/vendor → vendor}/constructor/lib/constructor.rb +0 -0
  262. data/{new_project_template/vendor/ceedling/vendor → vendor}/constructor/lib/constructor_struct.rb +0 -0
  263. data/vendor/constructor/specs/constructor_spec.rb +407 -0
  264. data/vendor/constructor/specs/constructor_struct_spec.rb +84 -0
  265. data/vendor/deep_merge/MIT-LICENSE +20 -0
  266. data/vendor/deep_merge/README +94 -0
  267. data/vendor/deep_merge/Rakefile +28 -0
  268. data/{new_project_template/vendor/ceedling/vendor → vendor}/deep_merge/lib/deep_merge.rb +0 -0
  269. data/vendor/deep_merge/pkg/deep_merge-0.1.0.gem +0 -0
  270. data/vendor/deep_merge/test/test_deep_merge.rb +553 -0
  271. data/vendor/diy/History.txt +28 -0
  272. data/vendor/diy/README.rdoc +233 -0
  273. data/vendor/diy/Rakefile +33 -0
  274. data/vendor/diy/TODO.txt +9 -0
  275. data/vendor/diy/diy.gemspec +131 -0
  276. data/{new_project_template/vendor/ceedling/vendor → vendor}/diy/lib/diy.rb +0 -0
  277. data/{new_project_template/vendor/ceedling/vendor → vendor}/diy/lib/diy/factory.rb +0 -0
  278. data/vendor/diy/sample_code/car.rb +7 -0
  279. data/vendor/diy/sample_code/chassis.rb +5 -0
  280. data/vendor/diy/sample_code/diy_example.rb +26 -0
  281. data/vendor/diy/sample_code/engine.rb +5 -0
  282. data/vendor/diy/sample_code/objects.yml +10 -0
  283. data/vendor/diy/test/constructor.rb +119 -0
  284. data/vendor/diy/test/diy_test.rb +608 -0
  285. data/vendor/diy/test/factory_test.rb +79 -0
  286. data/vendor/diy/test/files/broken_construction.yml +7 -0
  287. data/vendor/diy/test/files/cat/cat.rb +3 -0
  288. data/vendor/diy/test/files/cat/extra_conflict.yml +5 -0
  289. data/vendor/diy/test/files/cat/heritage.rb +2 -0
  290. data/vendor/diy/test/files/cat/needs_input.yml +3 -0
  291. data/vendor/diy/test/files/cat/the_cat_lineage.rb +1 -0
  292. data/vendor/diy/test/files/dog/dog_model.rb +3 -0
  293. data/vendor/diy/test/files/dog/dog_presenter.rb +3 -0
  294. data/vendor/diy/test/files/dog/dog_view.rb +2 -0
  295. data/vendor/diy/test/files/dog/file_resolver.rb +2 -0
  296. data/vendor/diy/test/files/dog/other_thing.rb +2 -0
  297. data/vendor/diy/test/files/dog/simple.yml +11 -0
  298. data/vendor/diy/test/files/donkey/foo.rb +8 -0
  299. data/vendor/diy/test/files/donkey/foo/bar/qux.rb +7 -0
  300. data/vendor/diy/test/files/factory/beef.rb +5 -0
  301. data/vendor/diy/test/files/factory/dog.rb +6 -0
  302. data/vendor/diy/test/files/factory/factory.yml +19 -0
  303. data/vendor/diy/test/files/factory/farm/llama.rb +7 -0
  304. data/vendor/diy/test/files/factory/farm/pork.rb +7 -0
  305. data/vendor/diy/test/files/factory/kitten.rb +13 -0
  306. data/vendor/diy/test/files/fud/objects.yml +13 -0
  307. data/vendor/diy/test/files/fud/toy.rb +14 -0
  308. data/vendor/diy/test/files/functions/attached_things_builder.rb +2 -0
  309. data/vendor/diy/test/files/functions/invalid_method.yml +5 -0
  310. data/vendor/diy/test/files/functions/method_extractor.rb +3 -0
  311. data/vendor/diy/test/files/functions/nonsingleton_objects.yml +6 -0
  312. data/vendor/diy/test/files/functions/objects.yml +22 -0
  313. data/vendor/diy/test/files/functions/thing.rb +3 -0
  314. data/vendor/diy/test/files/functions/thing_builder.rb +25 -0
  315. data/vendor/diy/test/files/functions/things_builder.rb +3 -0
  316. data/vendor/diy/test/files/gnu/objects.yml +14 -0
  317. data/vendor/diy/test/files/gnu/thinger.rb +7 -0
  318. data/vendor/diy/test/files/goat/base.rb +8 -0
  319. data/vendor/diy/test/files/goat/can.rb +6 -0
  320. data/vendor/diy/test/files/goat/goat.rb +6 -0
  321. data/vendor/diy/test/files/goat/objects.yml +12 -0
  322. data/vendor/diy/test/files/goat/paper.rb +6 -0
  323. data/vendor/diy/test/files/goat/plane.rb +7 -0
  324. data/vendor/diy/test/files/goat/shirt.rb +6 -0
  325. data/vendor/diy/test/files/goat/wings.rb +8 -0
  326. data/vendor/diy/test/files/horse/holder_thing.rb +3 -0
  327. data/vendor/diy/test/files/horse/objects.yml +7 -0
  328. data/vendor/diy/test/files/namespace/animal/bird.rb +5 -0
  329. data/vendor/diy/test/files/namespace/animal/cat.rb +5 -0
  330. data/vendor/diy/test/files/namespace/animal/reptile/hardshell/turtle.rb +8 -0
  331. data/vendor/diy/test/files/namespace/animal/reptile/lizard.rb +7 -0
  332. data/vendor/diy/test/files/namespace/bad_module_specified.yml +8 -0
  333. data/vendor/diy/test/files/namespace/class_name_combine.yml +8 -0
  334. data/vendor/diy/test/files/namespace/hello.txt +1 -0
  335. data/vendor/diy/test/files/namespace/no_module_specified.yml +8 -0
  336. data/vendor/diy/test/files/namespace/objects.yml +21 -0
  337. data/vendor/diy/test/files/namespace/road.rb +2 -0
  338. data/vendor/diy/test/files/namespace/sky.rb +2 -0
  339. data/vendor/diy/test/files/namespace/subcontext.yml +22 -0
  340. data/vendor/diy/test/files/non_singleton/air.rb +2 -0
  341. data/vendor/diy/test/files/non_singleton/fat_cat.rb +3 -0
  342. data/vendor/diy/test/files/non_singleton/objects.yml +19 -0
  343. data/vendor/diy/test/files/non_singleton/pig.rb +3 -0
  344. data/vendor/diy/test/files/non_singleton/thread_spinner.rb +3 -0
  345. data/vendor/diy/test/files/non_singleton/tick.rb +3 -0
  346. data/vendor/diy/test/files/non_singleton/yard.rb +2 -0
  347. data/vendor/diy/test/files/yak/core_model.rb +3 -0
  348. data/vendor/diy/test/files/yak/core_presenter.rb +3 -0
  349. data/vendor/diy/test/files/yak/core_view.rb +1 -0
  350. data/vendor/diy/test/files/yak/data_source.rb +1 -0
  351. data/vendor/diy/test/files/yak/fringe_model.rb +3 -0
  352. data/vendor/diy/test/files/yak/fringe_presenter.rb +3 -0
  353. data/vendor/diy/test/files/yak/fringe_view.rb +1 -0
  354. data/vendor/diy/test/files/yak/giant_squid.rb +3 -0
  355. data/vendor/diy/test/files/yak/krill.rb +2 -0
  356. data/vendor/diy/test/files/yak/my_objects.yml +21 -0
  357. data/vendor/diy/test/files/yak/sub_sub_context_test.yml +27 -0
  358. data/vendor/diy/test/test_helper.rb +55 -0
  359. data/vendor/hardmock/CHANGES +78 -0
  360. data/vendor/hardmock/LICENSE +7 -0
  361. data/vendor/hardmock/README +70 -0
  362. data/vendor/hardmock/Rakefile +8 -0
  363. data/vendor/hardmock/config/environment.rb +12 -0
  364. data/vendor/hardmock/lib/assert_error.rb +23 -0
  365. data/vendor/hardmock/lib/extend_test_unit.rb +14 -0
  366. data/vendor/hardmock/lib/hardmock.rb +86 -0
  367. data/vendor/hardmock/lib/hardmock/errors.rb +22 -0
  368. data/vendor/hardmock/lib/hardmock/expectation.rb +229 -0
  369. data/vendor/hardmock/lib/hardmock/expectation_builder.rb +9 -0
  370. data/vendor/hardmock/lib/hardmock/expector.rb +26 -0
  371. data/vendor/hardmock/lib/hardmock/method_cleanout.rb +33 -0
  372. data/vendor/hardmock/lib/hardmock/mock.rb +180 -0
  373. data/vendor/hardmock/lib/hardmock/mock_control.rb +53 -0
  374. data/vendor/hardmock/lib/hardmock/stubbing.rb +210 -0
  375. data/vendor/hardmock/lib/hardmock/trapper.rb +31 -0
  376. data/vendor/hardmock/lib/hardmock/utils.rb +9 -0
  377. data/vendor/hardmock/lib/test_unit_before_after.rb +169 -0
  378. data/vendor/hardmock/rake_tasks/rdoc.rake +19 -0
  379. data/vendor/hardmock/rake_tasks/rdoc_options.rb +4 -0
  380. data/vendor/hardmock/rake_tasks/test.rake +22 -0
  381. data/vendor/hardmock/test/functional/assert_error_test.rb +52 -0
  382. data/vendor/hardmock/test/functional/auto_verify_test.rb +178 -0
  383. data/vendor/hardmock/test/functional/direct_mock_usage_test.rb +396 -0
  384. data/vendor/hardmock/test/functional/hardmock_test.rb +434 -0
  385. data/vendor/hardmock/test/functional/stubbing_test.rb +479 -0
  386. data/vendor/hardmock/test/test_helper.rb +43 -0
  387. data/vendor/hardmock/test/unit/expectation_builder_test.rb +19 -0
  388. data/vendor/hardmock/test/unit/expectation_test.rb +372 -0
  389. data/vendor/hardmock/test/unit/expector_test.rb +57 -0
  390. data/vendor/hardmock/test/unit/method_cleanout_test.rb +36 -0
  391. data/vendor/hardmock/test/unit/mock_control_test.rb +175 -0
  392. data/vendor/hardmock/test/unit/mock_test.rb +279 -0
  393. data/vendor/hardmock/test/unit/test_unit_before_after_test.rb +452 -0
  394. data/vendor/hardmock/test/unit/trapper_test.rb +62 -0
  395. data/vendor/hardmock/test/unit/verify_error_test.rb +40 -0
  396. data/vendor/unity/auto/colour_prompt.rb +94 -0
  397. data/vendor/unity/auto/colour_reporter.rb +39 -0
  398. data/vendor/unity/auto/generate_module.rb +202 -0
  399. data/{new_project_template/vendor/ceedling/vendor → vendor}/unity/auto/generate_test_runner.rb +0 -0
  400. data/vendor/unity/auto/test_file_filter.rb +23 -0
  401. data/vendor/unity/auto/unity_test_summary.rb +139 -0
  402. data/vendor/unity/release/build.info +2 -0
  403. data/{new_project_template/vendor/ceedling/vendor → vendor}/unity/release/version.info +0 -0
  404. data/{new_project_template/vendor/ceedling/vendor → vendor}/unity/src/unity.c +0 -0
  405. data/{new_project_template/vendor/ceedling/vendor → vendor}/unity/src/unity.h +0 -0
  406. data/{new_project_template/vendor/ceedling/vendor → vendor}/unity/src/unity_internals.h +94 -6
  407. metadata +443 -237
  408. data/.vim +0 -1
  409. data/.yardopts +0 -1
  410. data/LICENSE +0 -19
  411. data/Rakefile +0 -118
  412. data/ceedling-gem.sublime-project +0 -8
  413. data/examples/blinky/.DS_Store +0 -0
  414. data/examples/temp_sensor/src/AT91SAM7X256.h +0 -2556
  415. data/examples/temp_sensor/src/UsartGetChar.c +0 -6
  416. data/examples/temp_sensor/src/UsartGetChar.h +0 -8
  417. data/examples/temp_sensor/test/test_AdcHardwareConfigurator.c +0 -43
  418. data/examples/temp_sensor/test/test_AdcTemperatureSensor.c +0 -47
  419. data/examples/temp_sensor/test/test_TimerConfigurator.c +0 -112
  420. data/examples/temp_sensor/test/test_TimerInterruptConfigurator.c +0 -78
  421. data/examples/temp_sensor/test/test_TimerInterruptHandler.c +0 -66
  422. data/examples/temp_sensor/test/test_UsartConfigurator.c +0 -77
  423. data/examples/temp_sensor/test/test_UsartGetChar.c +0 -17
  424. data/examples/temp_sensor/test/test_UsartPutChar.c +0 -43
  425. data/examples/temp_sensor/test/test_UsartTransmitBufferStatus.c +0 -22
  426. data/new_project_template/build/.gitkeep +0 -0
  427. data/new_project_template/src/.gitkeep +0 -0
  428. data/new_project_template/test/.gitkeep +0 -0
  429. data/new_project_template/test/support/.gitkeep +0 -0
  430. data/new_project_template/vendor/ceedling/docs/CExceptionSummary.pdf +0 -0
  431. data/new_project_template/vendor/ceedling/docs/CMock Summary.pdf +0 -0
  432. data/new_project_template/vendor/ceedling/docs/Ceedling Packet.pdf +0 -0
  433. data/new_project_template/vendor/ceedling/docs/Unity Summary.pdf +0 -0
  434. data/new_project_template/vendor/ceedling/lib/preprocessinator_extractor.rb +0 -36
  435. data/new_project_template/vendor/ceedling/release/build.info +0 -1
  436. data/new_project_template/vendor/ceedling/vendor/c_exception/release/build.info +0 -1
  437. data/new_project_template/vendor/ceedling/vendor/cmock/release/build.info +0 -1
  438. data/new_project_template/vendor/ceedling/vendor/unity/release/build.info +0 -1
@@ -0,0 +1,84 @@
1
+ require File.dirname(__FILE__) + '/../lib/constructor_struct'
2
+
3
+ describe ConstructorStruct, "#new" do
4
+ def struct(*accessors)
5
+ ConstructorStruct.new(*accessors)
6
+ end
7
+
8
+ def instance_of(clazz, args=nil)
9
+ args = [args] || []
10
+ clazz.new(*args)
11
+ end
12
+
13
+ before do
14
+ AClass = struct(:hello, :world) unless defined?(AClass)
15
+ end
16
+
17
+ it "creates a new class with accessors given a set of symbols or strings" do
18
+ instance_of(AClass, {:hello => "foo", :world => "bar"}).hello.should == "foo"
19
+ instance_of(AClass, {:hello => "foo", :world => "bar"}).world.should == "bar"
20
+ end
21
+
22
+ it "creates a real class" do
23
+ instance_of(AClass).class.should == AClass
24
+ end
25
+
26
+ it "has the option of creating a strict accessors" do
27
+ lambda { instance_of(struct(:foo, :strict => true)) }.should raise_error
28
+ end
29
+
30
+ it "does not have the option of not creating accessors" do
31
+ instance_of(struct(:foo, :accessors => false), :foo => "bar").foo.should == "bar"
32
+ end
33
+
34
+ describe "equivalence" do
35
+ before do
36
+ @hello = "Hello"
37
+ @world = "World"
38
+ @args = { :hello => @hello, :world => @world }
39
+ @target = AClass.new(@args)
40
+ end
41
+
42
+ it "uses all accessors" do
43
+ [ nil, :hello, :world ].each do |field_to_alter|
44
+ alt = AClass.new(:hello => @hello, :world => @world)
45
+
46
+ unless field_to_alter
47
+ # Base case: they should be equal
48
+ @target.should == alt
49
+ @target.eql?(alt).should be_true #should eql(alt)
50
+ else
51
+ # Change 1 field and see not equal
52
+ alt.send("#{field_to_alter}=", "other data")
53
+ @target.should_not == alt
54
+ @target.should_not eql(alt)
55
+ end
56
+ end
57
+ end
58
+
59
+ it "will not compare to another class with same fields" do
60
+ BClass = ConstructorStruct.new(:hello, :world)
61
+ alt = BClass.new(:hello => @hello, :world => @world)
62
+ @target.should_not == alt
63
+ @target.should_not eql(alt)
64
+ end
65
+ end
66
+
67
+ describe "extra method definitions" do
68
+ NightTrain = ConstructorStruct.new(:beer, :conductor) do
69
+ def setup
70
+ @conductor ||= "Bill"
71
+ end
72
+ end
73
+
74
+ it "lets you declare instance methods within a block" do
75
+ night_train = NightTrain.new(:beer => "Founders")
76
+ night_train.beer.should == "Founders"
77
+ night_train.conductor.should == "Bill"
78
+
79
+ other_train = NightTrain.new(:beer => "Bells", :conductor => "Dave")
80
+ other_train.conductor.should == "Dave"
81
+ end
82
+ end
83
+
84
+ end
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2008 [name of plugin creator]
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,94 @@
1
+ DeepMerge Overview
2
+ ==================
3
+
4
+ Deep Merge is a simple set of utility functions for Hash. It permits
5
+ you to merge elements inside a hash together recursively. The manner
6
+ by which it does this is somewhat arbitrary (since there is no defining
7
+ standard for this) but it should end up being pretty intuitive and do what
8
+ you expect.
9
+
10
+ You can learn a lot more about this by reading the test file. It's pretty
11
+ well documented and has many examples of various merges from very simple
12
+ to pretty complex.
13
+
14
+ The primary need that caused me to write this library is the merging of elements
15
+ coming from HTTP parameters and related stored parameters in session. This lets
16
+ a user build up a set of parameters over time, modifying individual items.
17
+
18
+ Deep Merge Core Documentation
19
+ =============================
20
+ There are three key methods that are added to Hash when you require deep_merge:
21
+
22
+ deep_merge!(new_hash[, opts]) -- merges and new_hash wins unmergeable situations
23
+ deep_merge(new_hash[, opts]) -- merges and "self" hash wins unmergeable situations
24
+ ko_deep_merge!(new_hash[, opts]) -- same as deep_merge! but "--" provides "knockout" functions
25
+
26
+ deep_merge! method permits merging of arbitrary child elements. The two top level
27
+ elements must be hashes. These hashes can contain unlimited (to stack limit) levels
28
+ of child elements. These child elements to not have to be of the same types.
29
+ Where child elements are of the same type, deep_merge will attempt to merge them together.
30
+ Where child elements are not of the same type, deep_merge will skip or optionally overwrite
31
+ the destination element with the contents of the source element at that level.
32
+ So if you have two hashes like this:
33
+ source = {:x => [1,2,3], :y => 2}
34
+ dest = {:x => [4,5,'6'], :y => [7,8,9]}
35
+ dest.deep_merge!(source)
36
+ Results: {:x => [1,2,3,4,5,'6'], :y => 2}
37
+ By default, "deep_merge!" will overwrite any unmergeables and merge everything else.
38
+ To avoid this, use "deep_merge" (no bang/exclamation mark)
39
+
40
+ Options:
41
+ Options are specified in the last parameter passed, which should be in hash format:
42
+ hash.deep_merge!({:x => [1,2]}, {:knockout_prefix => '--'})
43
+ :preserve_unmergeables DEFAULT: false
44
+ Set to true to skip any unmergeable elements from source
45
+ :knockout_prefix DEFAULT: nil
46
+ Set to string value to signify prefix which deletes elements from existing element
47
+ :sort_merged_arrays DEFAULT: false
48
+ Set to true to sort all arrays that are merged together
49
+ :unpack_arrays DEFAULT: nil
50
+ Set to string value to run "Array::join" then "String::split" against all arrays
51
+ :merge_debug DEFAULT: false
52
+ Set to true to get console output of merge process for debugging
53
+
54
+ Selected Options Details:
55
+ :knockout_prefix => The purpose of this is to provide a way to remove elements
56
+ from existing Hash by specifying them in a special way in incoming hash
57
+ source = {:x => ['--1', '2']}
58
+ dest = {:x => ['1', '3']}
59
+ dest.ko_deep_merge!(source)
60
+ Results: {:x => ['2','3']}
61
+ Additionally, if the knockout_prefix is passed alone as a string, it will cause
62
+ the entire element to be removed:
63
+ source = {:x => '--'}
64
+ dest = {:x => [1,2,3]}
65
+ dest.ko_deep_merge!(source)
66
+ Results: {:x => ""}
67
+ :unpack_arrays => The purpose of this is to permit compound elements to be passed
68
+ in as strings and to be converted into discrete array elements
69
+ irsource = {:x => ['1,2,3', '4']}
70
+ dest = {:x => ['5','6','7,8']}
71
+ dest.deep_merge!(source, {:unpack_arrays => ','})
72
+ Results: {:x => ['1','2','3','4','5','6','7','8'}
73
+ Why: If receiving data from an HTML form, this makes it easy for a checkbox
74
+ to pass multiple values from within a single HTML element
75
+
76
+ There are many tests for this library - and you can learn more about the features
77
+ and usages of deep_merge! by just browsing the test examples
78
+
79
+
80
+ Simple Example Code
81
+ ===================
82
+
83
+ require 'deep_merge'
84
+ x = {:x => [3,4,5]}
85
+ y = {:x => [1,2,3]}
86
+ y.deep_merge!(x)
87
+ # results: y = {:x => [1,2,3,4,5]}
88
+
89
+ Availablility
90
+ =============
91
+ SVN Repo here: http://trac.misuse.org/science/wiki/DeepMerge
92
+ Contact author: http://www.misuse.org/science
93
+
94
+ Copyright (c) 2008 Steve Midgley, released under the MIT license
@@ -0,0 +1,28 @@
1
+ require 'rubygems'
2
+ require 'lib/deep_merge'
3
+ Gem::manage_gems
4
+ require 'rake/gempackagetask'
5
+
6
+ spec = Gem::Specification.new do |s|
7
+ s.platform = Gem::Platform::RUBY
8
+ s.name = "deep_merge"
9
+ s.version = DeepMerge::VERSION
10
+ s.author = "Steve Midgley"
11
+ s.email = "public@misuse.org"
12
+ s.summary = "Permits recursive/deep merges of arrays and hashes."
13
+ s.files = FileList['lib/*.rb', 'test/*'].to_a
14
+ s.require_path = "lib"
15
+ s.autorequire = "deep_merge"
16
+ s.test_files = Dir.glob('tests/*.rb')
17
+ s.has_rdoc = true
18
+ s.extra_rdoc_files = ["README"]
19
+ end
20
+
21
+ Rake::GemPackageTask.new(spec) do |pkg|
22
+ pkg.need_tar = true
23
+ end
24
+
25
+ task :default => "pkg/#{spec.name}-#{spec.version}.gem" do
26
+ puts "generated latest version"
27
+ end
28
+
@@ -0,0 +1,553 @@
1
+ require 'test/unit'
2
+ require '../lib/deep_merge.rb'
3
+
4
+ class TestDeepMerge < Test::Unit::TestCase
5
+
6
+ def setup
7
+ end
8
+
9
+ # show that Hash object has deep merge capabilities in form of three methods:
10
+ # ko_deep_merge! # uses '--' knockout and overwrites unmergeable
11
+ # deep_merge! # overwrites unmergeable
12
+ # deep_merge # skips unmergeable
13
+ def test_hash_deep_merge
14
+ x = {}
15
+ assert x.respond_to?('deep_merge!'.to_sym)
16
+ hash_src = {'id' => [3,4,5]}
17
+ hash_dest = {'id' => [1,2,3]}
18
+ assert hash_dest.ko_deep_merge!(hash_src)
19
+ assert_equal({'id' => [1,2,3,4,5]}, hash_dest)
20
+
21
+ hash_src = {'id' => [3,4,5]}
22
+ hash_dest = {'id' => [1,2,3]}
23
+ assert hash_dest.deep_merge!(hash_src)
24
+ assert_equal({'id' => [1,2,3,4,5]}, hash_dest)
25
+
26
+ hash_src = {'id' => 'xxx'}
27
+ hash_dest = {'id' => [1,2,3]}
28
+ assert hash_dest.deep_merge(hash_src)
29
+ assert_equal({'id' => [1,2,3]}, hash_dest)
30
+ end
31
+
32
+ FIELD_KNOCKOUT_PREFIX = DeepMerge::DEFAULT_FIELD_KNOCKOUT_PREFIX
33
+
34
+ # tests DeepMerge::deep_merge! function
35
+ def test_deep_merge
36
+ # merge tests (moving from basic to more complex)
37
+
38
+ # test merging an hash w/array into blank hash
39
+ hash_src = {'id' => '2'}
40
+ hash_dst = {}
41
+ DeepMerge::deep_merge!(hash_src.dup, hash_dst, {:knockout_prefix => FIELD_KNOCKOUT_PREFIX, :unpack_arrays => ","})
42
+ assert_equal hash_src, hash_dst
43
+
44
+ # test merging an hash w/array into blank hash
45
+ hash_src = {'region' => {'id' => ['227', '2']}}
46
+ hash_dst = {}
47
+ DeepMerge::deep_merge!(hash_src, hash_dst, {:knockout_prefix => FIELD_KNOCKOUT_PREFIX, :unpack_arrays => ","})
48
+ assert_equal hash_src, hash_dst
49
+
50
+ # merge from empty hash
51
+ hash_src = {}
52
+ hash_dst = {"property" => ["2","4"]}
53
+ DeepMerge::deep_merge!(hash_src, hash_dst)
54
+ assert_equal({"property" => ["2","4"]}, hash_dst)
55
+
56
+ # merge to empty hash
57
+ hash_src = {"property" => ["2","4"]}
58
+ hash_dst = {}
59
+ DeepMerge::deep_merge!(hash_src, hash_dst)
60
+ assert_equal({"property" => ["2","4"]}, hash_dst)
61
+
62
+ # simple string overwrite
63
+ hash_src = {"name" => "value"}
64
+ hash_dst = {"name" => "value1"}
65
+ DeepMerge::deep_merge!(hash_src, hash_dst)
66
+ assert_equal({"name" => "value"}, hash_dst)
67
+
68
+ # simple string overwrite of empty hash
69
+ hash_src = {"name" => "value"}
70
+ hash_dst = {}
71
+ DeepMerge::deep_merge!(hash_src, hash_dst)
72
+ assert_equal(hash_src, hash_dst)
73
+
74
+ # hashes holding array
75
+ hash_src = {"property" => ["1","3"]}
76
+ hash_dst = {"property" => ["2","4"]}
77
+ DeepMerge::deep_merge!(hash_src, hash_dst)
78
+ assert_equal(["2","4","1","3"], hash_dst['property'])
79
+
80
+ # hashes holding array (sorted)
81
+ hash_src = {"property" => ["1","3"]}
82
+ hash_dst = {"property" => ["2","4"]}
83
+ DeepMerge::deep_merge!(hash_src, hash_dst, {:sort_merged_arrays => true})
84
+ assert_equal(["1","2","3","4"].sort, hash_dst['property'])
85
+
86
+ # hashes holding hashes holding arrays (array with duplicate elements is merged with dest then src
87
+ hash_src = {"property" => {"bedroom_count" => ["1", "2"], "bathroom_count" => ["1", "4+"]}}
88
+ hash_dst = {"property" => {"bedroom_count" => ["3", "2"], "bathroom_count" => ["2"]}}
89
+ DeepMerge::deep_merge!(hash_src, hash_dst)
90
+ assert_equal({"property" => {"bedroom_count" => ["3","2","1"], "bathroom_count" => ["2", "1", "4+"]}}, hash_dst)
91
+
92
+ # hash holding hash holding array v string (string is overwritten by array)
93
+ hash_src = {"property" => {"bedroom_count" => ["1", "2"], "bathroom_count" => ["1", "4+"]}}
94
+ hash_dst = {"property" => {"bedroom_count" => "3", "bathroom_count" => ["2"]}}
95
+ DeepMerge::deep_merge!(hash_src, hash_dst)
96
+ assert_equal({"property" => {"bedroom_count" => ["1", "2"], "bathroom_count" => ["2","1","4+"]}}, hash_dst)
97
+
98
+ # hash holding hash holding array v string (string is NOT overwritten by array)
99
+ hash_src = {"property" => {"bedroom_count" => ["1", "2"], "bathroom_count" => ["1", "4+"]}}
100
+ hash_dst = {"property" => {"bedroom_count" => "3", "bathroom_count" => ["2"]}}
101
+ DeepMerge::deep_merge!(hash_src, hash_dst, {:preserve_unmergeables => true})
102
+ assert_equal({"property" => {"bedroom_count" => "3", "bathroom_count" => ["2","1","4+"]}}, hash_dst)
103
+
104
+ # hash holding hash holding string v array (array is overwritten by string)
105
+ hash_src = {"property" => {"bedroom_count" => "3", "bathroom_count" => ["1", "4+"]}}
106
+ hash_dst = {"property" => {"bedroom_count" => ["1", "2"], "bathroom_count" => ["2"]}}
107
+ DeepMerge::deep_merge!(hash_src, hash_dst)
108
+ assert_equal({"property" => {"bedroom_count" => "3", "bathroom_count" => ["2","1","4+"]}}, hash_dst)
109
+
110
+ # hash holding hash holding string v array (array does NOT overwrite string)
111
+ hash_src = {"property" => {"bedroom_count" => "3", "bathroom_count" => ["1", "4+"]}}
112
+ hash_dst = {"property" => {"bedroom_count" => ["1", "2"], "bathroom_count" => ["2"]}}
113
+ DeepMerge::deep_merge!(hash_src, hash_dst, {:preserve_unmergeables => true})
114
+ assert_equal({"property" => {"bedroom_count" => ["1", "2"], "bathroom_count" => ["2","1","4+"]}}, hash_dst)
115
+
116
+ # hash holding hash holding hash v array (array is overwritten by hash)
117
+ hash_src = {"property" => {"bedroom_count" => {"king_bed" => 3, "queen_bed" => 1}, "bathroom_count" => ["1", "4+"]}}
118
+ hash_dst = {"property" => {"bedroom_count" => ["1", "2"], "bathroom_count" => ["2"]}}
119
+ DeepMerge::deep_merge!(hash_src, hash_dst)
120
+ assert_equal({"property" => {"bedroom_count" => {"king_bed" => 3, "queen_bed" => 1}, "bathroom_count" => ["2","1","4+"]}}, hash_dst)
121
+
122
+ # hash holding hash holding hash v array (array is NOT overwritten by hash)
123
+ hash_src = {"property" => {"bedroom_count" => {"king_bed" => 3, "queen_bed" => 1}, "bathroom_count" => ["1", "4+"]}}
124
+ hash_dst = {"property" => {"bedroom_count" => ["1", "2"], "bathroom_count" => ["2"]}}
125
+ DeepMerge::deep_merge!(hash_src, hash_dst, {:preserve_unmergeables => true})
126
+ assert_equal({"property" => {"bedroom_count" => ["1", "2"], "bathroom_count" => ["2","1","4+"]}}, hash_dst)
127
+
128
+ # 3 hash layers holding integers (integers are overwritten by source)
129
+ hash_src = {"property" => {"bedroom_count" => {"king_bed" => 3, "queen_bed" => 1}, "bathroom_count" => ["1", "4+"]}}
130
+ hash_dst = {"property" => {"bedroom_count" => {"king_bed" => 2, "queen_bed" => 4}, "bathroom_count" => ["2"]}}
131
+ DeepMerge::deep_merge!(hash_src, hash_dst)
132
+ assert_equal({"property" => {"bedroom_count" => {"king_bed" => 3, "queen_bed" => 1}, "bathroom_count" => ["2","1","4+"]}}, hash_dst)
133
+
134
+ # 3 hash layers holding arrays of int (arrays are merged)
135
+ hash_src = {"property" => {"bedroom_count" => {"king_bed" => [3], "queen_bed" => [1]}, "bathroom_count" => ["1", "4+"]}}
136
+ hash_dst = {"property" => {"bedroom_count" => {"king_bed" => [2], "queen_bed" => [4]}, "bathroom_count" => ["2"]}}
137
+ DeepMerge::deep_merge!(hash_src, hash_dst)
138
+ assert_equal({"property" => {"bedroom_count" => {"king_bed" => [2,3], "queen_bed" => [4,1]}, "bathroom_count" => ["2","1","4+"]}}, hash_dst)
139
+
140
+ # 1 hash overwriting 3 hash layers holding arrays of int
141
+ hash_src = {"property" => "1"}
142
+ hash_dst = {"property" => {"bedroom_count" => {"king_bed" => [2], "queen_bed" => [4]}, "bathroom_count" => ["2"]}}
143
+ DeepMerge::deep_merge!(hash_src, hash_dst)
144
+ assert_equal({"property" => "1"}, hash_dst)
145
+
146
+ # 1 hash NOT overwriting 3 hash layers holding arrays of int
147
+ hash_src = {"property" => "1"}
148
+ hash_dst = {"property" => {"bedroom_count" => {"king_bed" => [2], "queen_bed" => [4]}, "bathroom_count" => ["2"]}}
149
+ DeepMerge::deep_merge!(hash_src, hash_dst, {:preserve_unmergeables => true})
150
+ assert_equal({"property" => {"bedroom_count" => {"king_bed" => [2], "queen_bed" => [4]}, "bathroom_count" => ["2"]}}, hash_dst)
151
+
152
+ # 3 hash layers holding arrays of int (arrays are merged) but second hash's array is overwritten
153
+ hash_src = {"property" => {"bedroom_count" => {"king_bed" => [3], "queen_bed" => [1]}, "bathroom_count" => "1"}}
154
+ hash_dst = {"property" => {"bedroom_count" => {"king_bed" => [2], "queen_bed" => [4]}, "bathroom_count" => ["2"]}}
155
+ DeepMerge::deep_merge!(hash_src, hash_dst)
156
+ assert_equal({"property" => {"bedroom_count" => {"king_bed" => [2,3], "queen_bed" => [4,1]}, "bathroom_count" => "1"}}, hash_dst)
157
+
158
+ # 3 hash layers holding arrays of int (arrays are merged) but second hash's array is NOT overwritten
159
+ hash_src = {"property" => {"bedroom_count" => {"king_bed" => [3], "queen_bed" => [1]}, "bathroom_count" => "1"}}
160
+ hash_dst = {"property" => {"bedroom_count" => {"king_bed" => [2], "queen_bed" => [4]}, "bathroom_count" => ["2"]}}
161
+ DeepMerge::deep_merge!(hash_src, hash_dst, {:preserve_unmergeables => true})
162
+ assert_equal({"property" => {"bedroom_count" => {"king_bed" => [2,3], "queen_bed" => [4,1]}, "bathroom_count" => ["2"]}}, hash_dst)
163
+
164
+ # 3 hash layers holding arrays of int, but one holds int. This one overwrites, but the rest merge
165
+ hash_src = {"property" => {"bedroom_count" => {"king_bed" => 3, "queen_bed" => [1]}, "bathroom_count" => ["1"]}}
166
+ hash_dst = {"property" => {"bedroom_count" => {"king_bed" => [2], "queen_bed" => [4]}, "bathroom_count" => ["2"]}}
167
+ DeepMerge::deep_merge!(hash_src, hash_dst)
168
+ assert_equal({"property" => {"bedroom_count" => {"king_bed" => 3, "queen_bed" => [4,1]}, "bathroom_count" => ["2","1"]}}, hash_dst)
169
+
170
+ # 3 hash layers holding arrays of int, but source is incomplete.
171
+ hash_src = {"property" => {"bedroom_count" => {"king_bed" => [3]}, "bathroom_count" => ["1"]}}
172
+ hash_dst = {"property" => {"bedroom_count" => {"king_bed" => [2], "queen_bed" => [4]}, "bathroom_count" => ["2"]}}
173
+ DeepMerge::deep_merge!(hash_src, hash_dst)
174
+ assert_equal({"property" => {"bedroom_count" => {"king_bed" => [2,3], "queen_bed" => [4]}, "bathroom_count" => ["2","1"]}}, hash_dst)
175
+
176
+ # 3 hash layers holding arrays of int, but source is shorter and has new 2nd level ints.
177
+ hash_src = {"property" => {"bedroom_count" => {2=>3, "king_bed" => [3]}, "bathroom_count" => ["1"]}}
178
+ hash_dst = {"property" => {"bedroom_count" => {"king_bed" => [2], "queen_bed" => [4]}, "bathroom_count" => ["2"]}}
179
+ DeepMerge::deep_merge!(hash_src, hash_dst)
180
+ assert_equal({"property" => {"bedroom_count" => {2=>3, "king_bed" => [2,3], "queen_bed" => [4]}, "bathroom_count" => ["2","1"]}}, hash_dst)
181
+
182
+ # 3 hash layers holding arrays of int, but source is empty
183
+ hash_src = {}
184
+ hash_dst = {"property" => {"bedroom_count" => {"king_bed" => [2], "queen_bed" => [4]}, "bathroom_count" => ["2"]}}
185
+ DeepMerge::deep_merge!(hash_src, hash_dst)
186
+ assert_equal({"property" => {"bedroom_count" => {"king_bed" => [2], "queen_bed" => [4]}, "bathroom_count" => ["2"]}}, hash_dst)
187
+
188
+ # 3 hash layers holding arrays of int, but dest is empty
189
+ hash_src = {"property" => {"bedroom_count" => {2=>3, "king_bed" => [3]}, "bathroom_count" => ["1"]}}
190
+ hash_dst = {}
191
+ DeepMerge::deep_merge!(hash_src, hash_dst)
192
+ assert_equal({"property" => {"bedroom_count" => {2=>3, "king_bed" => [3]}, "bathroom_count" => ["1"]}}, hash_dst)
193
+
194
+ # test parameter management for knockout_prefix and overwrite unmergable
195
+ assert_raise(DeepMerge::InvalidParameter) {DeepMerge::deep_merge!(hash_src, hash_dst, {:knockout_prefix => ""})}
196
+ assert_raise(DeepMerge::InvalidParameter) {DeepMerge::deep_merge!(hash_src, hash_dst, {:preserve_unmergeables => true, :knockout_prefix => ""})}
197
+ assert_raise(DeepMerge::InvalidParameter) {DeepMerge::deep_merge!(hash_src, hash_dst, {:preserve_unmergeables => true, :knockout_prefix => "--"})}
198
+ assert_nothing_raised(DeepMerge::InvalidParameter) {DeepMerge::deep_merge!(hash_src, hash_dst, {:knockout_prefix => "--"})}
199
+ assert_nothing_raised(DeepMerge::InvalidParameter) {DeepMerge::deep_merge!(hash_src, hash_dst)}
200
+ assert_nothing_raised(DeepMerge::InvalidParameter) {DeepMerge::deep_merge!(hash_src, hash_dst, {:preserve_unmergeables => true})}
201
+
202
+ # hash holding arrays of arrays
203
+ hash_src = {["1", "2", "3"] => ["1", "2"]}
204
+ hash_dst = {["4", "5"] => ["3"]}
205
+ DeepMerge::deep_merge!(hash_src, hash_dst)
206
+ assert_equal({["1","2","3"] => ["1", "2"], ["4", "5"] => ["3"]}, hash_dst)
207
+
208
+ # test merging of hash with blank hash, and make sure that source array split still functions
209
+ hash_src = {'property' => {'bedroom_count' => ["1","2,3"]}}
210
+ hash_dst = {}
211
+ DeepMerge::deep_merge!(hash_src, hash_dst, {:knockout_prefix => FIELD_KNOCKOUT_PREFIX, :unpack_arrays => ","})
212
+ assert_equal({'property' => {'bedroom_count' => ["1","2","3"]}}, hash_dst)
213
+
214
+ # test merging of hash with blank hash, and make sure that source array split does not function when turned off
215
+ hash_src = {'property' => {'bedroom_count' => ["1","2,3"]}}
216
+ hash_dst = {}
217
+ DeepMerge::deep_merge!(hash_src, hash_dst, {:knockout_prefix => FIELD_KNOCKOUT_PREFIX})
218
+ assert_equal({'property' => {'bedroom_count' => ["1","2,3"]}}, hash_dst)
219
+
220
+ # test merging into a blank hash with overwrite_unmergeables turned on
221
+ hash_src = {"action"=>"browse", "controller"=>"results"}
222
+ hash_dst = {}
223
+ DeepMerge::deep_merge!(hash_src, hash_dst, {:overwrite_unmergeables => true, :knockout_prefix => FIELD_KNOCKOUT_PREFIX, :unpack_arrays => ","})
224
+ assert_equal hash_src, hash_dst
225
+
226
+ # KNOCKOUT_PREFIX testing
227
+ # the next few tests are looking for correct behavior from specific real-world params/session merges
228
+ # using the custom modifiers built for param/session merges
229
+
230
+ [nil, ","].each do |ko_split|
231
+ # typical params/session style hash with knockout_merge elements
232
+ hash_params = {"property"=>{"bedroom_count"=>[FIELD_KNOCKOUT_PREFIX+"1", "2", "3"]}}
233
+ hash_session = {"property"=>{"bedroom_count"=>["1", "2", "3"]}}
234
+ DeepMerge::deep_merge!(hash_params, hash_session, {:knockout_prefix => FIELD_KNOCKOUT_PREFIX, :unpack_arrays => ko_split})
235
+ assert_equal({"property"=>{"bedroom_count"=>["2", "3"]}}, hash_session)
236
+
237
+ # typical params/session style hash with knockout_merge elements
238
+ hash_params = {"property"=>{"bedroom_count"=>[FIELD_KNOCKOUT_PREFIX+"1", "2", "3"]}}
239
+ hash_session = {"property"=>{"bedroom_count"=>["3"]}}
240
+ DeepMerge::deep_merge!(hash_params, hash_session, {:knockout_prefix => FIELD_KNOCKOUT_PREFIX, :unpack_arrays => ko_split})
241
+ assert_equal({"property"=>{"bedroom_count"=>["3","2"]}}, hash_session)
242
+
243
+ # typical params/session style hash with knockout_merge elements
244
+ hash_params = {"property"=>{"bedroom_count"=>[FIELD_KNOCKOUT_PREFIX+"1", "2", "3"]}}
245
+ hash_session = {"property"=>{"bedroom_count"=>["4"]}}
246
+ DeepMerge::deep_merge!(hash_params, hash_session, {:knockout_prefix => FIELD_KNOCKOUT_PREFIX, :unpack_arrays => ko_split})
247
+ assert_equal({"property"=>{"bedroom_count"=>["4","2","3"]}}, hash_session)
248
+
249
+ # typical params/session style hash with knockout_merge elements
250
+ hash_params = {"property"=>{"bedroom_count"=>[FIELD_KNOCKOUT_PREFIX+"1", "2", "3"]}}
251
+ hash_session = {"property"=>{"bedroom_count"=>[FIELD_KNOCKOUT_PREFIX+"1", "4"]}}
252
+ DeepMerge::deep_merge!(hash_params, hash_session, {:knockout_prefix => FIELD_KNOCKOUT_PREFIX, :unpack_arrays => ko_split})
253
+ assert_equal({"property"=>{"bedroom_count"=>["4","2","3"]}}, hash_session)
254
+
255
+ # typical params/session style hash with knockout_merge elements
256
+ hash_params = {"amenity"=>{"id"=>[FIELD_KNOCKOUT_PREFIX+"1", FIELD_KNOCKOUT_PREFIX+"2", "3", "4"]}}
257
+ hash_session = {"amenity"=>{"id"=>["1", "2"]}}
258
+ DeepMerge::deep_merge!(hash_params, hash_session, {:knockout_prefix => FIELD_KNOCKOUT_PREFIX, :unpack_arrays => ko_split})
259
+ assert_equal({"amenity"=>{"id"=>["3","4"]}}, hash_session)
260
+ end
261
+
262
+ # special params/session style hash with knockout_merge elements in form src: ["1","2"] dest:["--1,--2", "3,4"]
263
+ hash_params = {"amenity"=>{"id"=>[FIELD_KNOCKOUT_PREFIX+"1,"+FIELD_KNOCKOUT_PREFIX+"2", "3,4"]}}
264
+ hash_session = {"amenity"=>{"id"=>["1", "2"]}}
265
+ DeepMerge::deep_merge!(hash_params, hash_session, {:knockout_prefix => FIELD_KNOCKOUT_PREFIX, :unpack_arrays => ","})
266
+ assert_equal({"amenity"=>{"id"=>["3","4"]}}, hash_session)
267
+
268
+ # same as previous but without ko_split value, this merge should fail
269
+ hash_params = {"amenity"=>{"id"=>[FIELD_KNOCKOUT_PREFIX+"1,"+FIELD_KNOCKOUT_PREFIX+"2", "3,4"]}}
270
+ hash_session = {"amenity"=>{"id"=>["1", "2"]}}
271
+ DeepMerge::deep_merge!(hash_params, hash_session, {:knockout_prefix => FIELD_KNOCKOUT_PREFIX})
272
+ assert_equal({"amenity"=>{"id"=>["1","2","3,4"]}}, hash_session)
273
+
274
+ # special params/session style hash with knockout_merge elements in form src: ["1","2"] dest:["--1,--2", "3,4"]
275
+ hash_params = {"amenity"=>{"id"=>[FIELD_KNOCKOUT_PREFIX+"1,2", "3,4", "--5", "6"]}}
276
+ hash_session = {"amenity"=>{"id"=>["1", "2"]}}
277
+ DeepMerge::deep_merge!(hash_params, hash_session, {:knockout_prefix => FIELD_KNOCKOUT_PREFIX, :unpack_arrays => ","})
278
+ assert_equal({"amenity"=>{"id"=>["2","3","4","6"]}}, hash_session)
279
+
280
+ # special params/session style hash with knockout_merge elements in form src: ["--1,--2", "3,4", "--5", "6"] dest:["1,2", "3,4"]
281
+ hash_params = {"amenity"=>{"id"=>["#{FIELD_KNOCKOUT_PREFIX}1,#{FIELD_KNOCKOUT_PREFIX}2", "3,4", "#{FIELD_KNOCKOUT_PREFIX}5", "6"]}}
282
+ hash_session = {"amenity"=>{"id"=>["1", "2", "3", "4"]}}
283
+ DeepMerge::deep_merge!(hash_params, hash_session, {:knockout_prefix => FIELD_KNOCKOUT_PREFIX, :unpack_arrays => ","})
284
+ assert_equal({"amenity"=>{"id"=>["3","4","6"]}}, hash_session)
285
+
286
+
287
+ hash_src = {"url_regions"=>[], "region"=>{"ids"=>["227,233"]}, "action"=>"browse", "task"=>"browse", "controller"=>"results"}
288
+ hash_dst = {"region"=>{"ids"=>["227"]}}
289
+ DeepMerge::deep_merge!(hash_src.dup, hash_dst, {:overwrite_unmergeables => true, :knockout_prefix => FIELD_KNOCKOUT_PREFIX, :unpack_arrays => ","})
290
+ assert_equal({"url_regions"=>[], "region"=>{"ids"=>["227","233"]}, "action"=>"browse", "task"=>"browse", "controller"=>"results"}, hash_dst)
291
+
292
+ hash_src = {"region"=>{"ids"=>["--","227"], "id"=>"230"}}
293
+ hash_dst = {"region"=>{"ids"=>["227", "233", "324", "230", "230"], "id"=>"230"}}
294
+ DeepMerge::deep_merge!(hash_src, hash_dst, {:overwrite_unmergeables => true, :knockout_prefix => FIELD_KNOCKOUT_PREFIX, :unpack_arrays => ","})
295
+ assert_equal({"region"=>{"ids"=>["227"], "id"=>"230"}}, hash_dst)
296
+
297
+ hash_src = {"region"=>{"ids"=>["--","227", "232", "233"], "id"=>"232"}}
298
+ hash_dst = {"region"=>{"ids"=>["227", "233", "324", "230", "230"], "id"=>"230"}}
299
+ DeepMerge::deep_merge!(hash_src, hash_dst, {:overwrite_unmergeables => true, :knockout_prefix => FIELD_KNOCKOUT_PREFIX, :unpack_arrays => ","})
300
+ assert_equal({"region"=>{"ids"=>["227", "232", "233"], "id"=>"232"}}, hash_dst)
301
+
302
+ hash_src = {"region"=>{"ids"=>["--,227,232,233"], "id"=>"232"}}
303
+ hash_dst = {"region"=>{"ids"=>["227", "233", "324", "230", "230"], "id"=>"230"}}
304
+ DeepMerge::deep_merge!(hash_src, hash_dst, {:overwrite_unmergeables => true, :knockout_prefix => FIELD_KNOCKOUT_PREFIX, :unpack_arrays => ","})
305
+ assert_equal({"region"=>{"ids"=>["227", "232", "233"], "id"=>"232"}}, hash_dst)
306
+
307
+ hash_src = {"region"=>{"ids"=>["--,227,232","233"], "id"=>"232"}}
308
+ hash_dst = {"region"=>{"ids"=>["227", "233", "324", "230", "230"], "id"=>"230"}}
309
+ DeepMerge::deep_merge!(hash_src, hash_dst, {:overwrite_unmergeables => true, :knockout_prefix => FIELD_KNOCKOUT_PREFIX, :unpack_arrays => ","})
310
+ assert_equal({"region"=>{"ids"=>["227", "232", "233"], "id"=>"232"}}, hash_dst)
311
+
312
+ hash_src = {"region"=>{"ids"=>["--,227"], "id"=>"230"}}
313
+ hash_dst = {"region"=>{"ids"=>["227", "233", "324", "230", "230"], "id"=>"230"}}
314
+ DeepMerge::deep_merge!(hash_src, hash_dst, {:overwrite_unmergeables => true, :knockout_prefix => FIELD_KNOCKOUT_PREFIX, :unpack_arrays => ","})
315
+ assert_equal({"region"=>{"ids"=>["227"], "id"=>"230"}}, hash_dst)
316
+
317
+ hash_src = {"region"=>{"ids"=>["--,227"], "id"=>"230"}}
318
+ hash_dst = {"region"=>{"ids"=>["227", "233", "324", "230", "230"], "id"=>"230"}, "action"=>"browse", "task"=>"browse", "controller"=>"results", "property_order_by"=>"property_type.descr"}
319
+ DeepMerge::deep_merge!(hash_src, hash_dst, {:overwrite_unmergeables => true, :knockout_prefix => FIELD_KNOCKOUT_PREFIX, :unpack_arrays => ","})
320
+ assert_equal({"region"=>{"ids"=>["227"], "id"=>"230"}, "action"=>"browse", "task"=>"browse",
321
+ "controller"=>"results", "property_order_by"=>"property_type.descr"}, hash_dst)
322
+
323
+ hash_src = {"query_uuid"=>"6386333d-389b-ab5c-8943-6f3a2aa914d7", "region"=>{"ids"=>["--,227"], "id"=>"230"}}
324
+ hash_dst = {"query_uuid"=>"6386333d-389b-ab5c-8943-6f3a2aa914d7", "url_regions"=>[], "region"=>{"ids"=>["227", "233", "324", "230", "230"], "id"=>"230"}, "action"=>"browse", "task"=>"browse", "controller"=>"results", "property_order_by"=>"property_type.descr"}
325
+ DeepMerge::deep_merge!(hash_src, hash_dst, {:overwrite_unmergeables => true, :knockout_prefix => FIELD_KNOCKOUT_PREFIX, :unpack_arrays => ","})
326
+ assert_equal({"query_uuid" => "6386333d-389b-ab5c-8943-6f3a2aa914d7", "url_regions"=>[],
327
+ "region"=>{"ids"=>["227"], "id"=>"230"}, "action"=>"browse", "task"=>"browse",
328
+ "controller"=>"results", "property_order_by"=>"property_type.descr"}, hash_dst)
329
+
330
+ # knock out entire dest hash if "--" is passed for source
331
+ hash_params = {'amenity' => "--"}
332
+ hash_session = {"amenity" => "1"}
333
+ DeepMerge::deep_merge!(hash_params, hash_session, {:knockout_prefix => "--", :unpack_arrays => ","})
334
+ assert_equal({'amenity' => ""}, hash_session)
335
+
336
+ # knock out entire dest hash if "--" is passed for source
337
+ hash_params = {'amenity' => ["--"]}
338
+ hash_session = {"amenity" => "1"}
339
+ DeepMerge::deep_merge!(hash_params, hash_session, {:knockout_prefix => "--", :unpack_arrays => ","})
340
+ assert_equal({'amenity' => []}, hash_session)
341
+
342
+ # knock out entire dest hash if "--" is passed for source
343
+ hash_params = {'amenity' => "--"}
344
+ hash_session = {"amenity" => ["1"]}
345
+ DeepMerge::deep_merge!(hash_params, hash_session, {:knockout_prefix => "--", :unpack_arrays => ","})
346
+ assert_equal({'amenity' => ""}, hash_session)
347
+
348
+ # knock out entire dest hash if "--" is passed for source
349
+ hash_params = {'amenity' => ["--"]}
350
+ hash_session = {"amenity" => ["1"]}
351
+ DeepMerge::deep_merge!(hash_params, hash_session, {:knockout_prefix => "--", :unpack_arrays => ","})
352
+ assert_equal({'amenity' => []}, hash_session)
353
+
354
+ # knock out entire dest hash if "--" is passed for source
355
+ hash_params = {'amenity' => ["--"]}
356
+ hash_session = {"amenity" => "1"}
357
+ DeepMerge::deep_merge!(hash_params, hash_session, {:knockout_prefix => "--", :unpack_arrays => ","})
358
+ assert_equal({'amenity' => []}, hash_session)
359
+
360
+ # knock out entire dest hash if "--" is passed for source
361
+ hash_params = {'amenity' => ["--", "2"]}
362
+ hash_session = {'amenity' => ["1", "3", "7+"]}
363
+ DeepMerge::deep_merge!(hash_params, hash_session, {:knockout_prefix => "--", :unpack_arrays => ","})
364
+ assert_equal({'amenity' => ["2"]}, hash_session)
365
+
366
+ # knock out entire dest hash if "--" is passed for source
367
+ hash_params = {'amenity' => ["--", "2"]}
368
+ hash_session = {'amenity' => "5"}
369
+ DeepMerge::deep_merge!(hash_params, hash_session, {:knockout_prefix => "--", :unpack_arrays => ","})
370
+ assert_equal({'amenity' => ['2']}, hash_session)
371
+
372
+ # knock out entire dest hash if "--" is passed for source
373
+ hash_params = {'amenity' => "--"}
374
+ hash_session = {"amenity"=>{"id"=>["1", "2", "3", "4"]}}
375
+ DeepMerge::deep_merge!(hash_params, hash_session, {:knockout_prefix => "--", :unpack_arrays => ","})
376
+ assert_equal({'amenity' => ""}, hash_session)
377
+
378
+ # knock out entire dest hash if "--" is passed for source
379
+ hash_params = {'amenity' => ["--"]}
380
+ hash_session = {"amenity"=>{"id"=>["1", "2", "3", "4"]}}
381
+ DeepMerge::deep_merge!(hash_params, hash_session, {:knockout_prefix => "--", :unpack_arrays => ","})
382
+ assert_equal({'amenity' => []}, hash_session)
383
+
384
+ # knock out dest array if "--" is passed for source
385
+ hash_params = {"region" => {'ids' => FIELD_KNOCKOUT_PREFIX}}
386
+ hash_session = {"region"=>{"ids"=>["1", "2", "3", "4"]}}
387
+ DeepMerge::deep_merge!(hash_params, hash_session, {:knockout_prefix => FIELD_KNOCKOUT_PREFIX, :unpack_arrays => ","})
388
+ assert_equal({'region' => {'ids' => ""}}, hash_session)
389
+
390
+ # knock out dest array but leave other elements of hash intact
391
+ hash_params = {"region" => {'ids' => FIELD_KNOCKOUT_PREFIX}}
392
+ hash_session = {"region"=>{"ids"=>["1", "2", "3", "4"], 'id'=>'11'}}
393
+ DeepMerge::deep_merge!(hash_params, hash_session, {:knockout_prefix => FIELD_KNOCKOUT_PREFIX, :unpack_arrays => ","})
394
+ assert_equal({'region' => {'ids' => "", 'id'=>'11'}}, hash_session)
395
+
396
+ # knock out entire tree of dest hash
397
+ hash_params = {"region" => FIELD_KNOCKOUT_PREFIX}
398
+ hash_session = {"region"=>{"ids"=>["1", "2", "3", "4"], 'id'=>'11'}}
399
+ DeepMerge::deep_merge!(hash_params, hash_session, {:knockout_prefix => FIELD_KNOCKOUT_PREFIX, :unpack_arrays => ","})
400
+ assert_equal({'region' => ""}, hash_session)
401
+
402
+ # knock out entire tree of dest hash - retaining array format
403
+ hash_params = {"region" => {'ids' => [FIELD_KNOCKOUT_PREFIX]}}
404
+ hash_session = {"region"=>{"ids"=>["1", "2", "3", "4"], 'id'=>'11'}}
405
+ DeepMerge::deep_merge!(hash_params, hash_session, {:knockout_prefix => FIELD_KNOCKOUT_PREFIX, :unpack_arrays => ","})
406
+ assert_equal({'region' => {'ids' => [], 'id'=>'11'}}, hash_session)
407
+
408
+ # knock out entire tree of dest hash & replace with new content
409
+ hash_params = {"region" => {'ids' => ["2", FIELD_KNOCKOUT_PREFIX, "6"]}}
410
+ hash_session = {"region"=>{"ids"=>["1", "2", "3", "4"], 'id'=>'11'}}
411
+ DeepMerge::deep_merge!(hash_params, hash_session, {:knockout_prefix => FIELD_KNOCKOUT_PREFIX, :unpack_arrays => ","})
412
+ assert_equal({'region' => {'ids' => ["2", "6"], 'id'=>'11'}}, hash_session)
413
+
414
+ # knock out entire tree of dest hash & replace with new content
415
+ hash_params = {"region" => {'ids' => ["7", FIELD_KNOCKOUT_PREFIX, "6"]}}
416
+ hash_session = {"region"=>{"ids"=>["1", "2", "3", "4"], 'id'=>'11'}}
417
+ DeepMerge::deep_merge!(hash_params, hash_session, {:knockout_prefix => FIELD_KNOCKOUT_PREFIX, :unpack_arrays => ","})
418
+ assert_equal({'region' => {'ids' => ["7", "6"], 'id'=>'11'}}, hash_session)
419
+
420
+ # edge test: make sure that when we turn off knockout_prefix that all values are processed correctly
421
+ hash_params = {"region" => {'ids' => ["7", "--", "2", "6,8"]}}
422
+ hash_session = {"region"=>{"ids"=>["1", "2", "3", "4"], 'id'=>'11'}}
423
+ DeepMerge::deep_merge!(hash_params, hash_session, {:unpack_arrays => ","})
424
+ assert_equal({'region' => {'ids' => ["1", "2", "3", "4", "7", "--", "6", "8"], 'id'=>'11'}}, hash_session)
425
+
426
+ # edge test 2: make sure that when we turn off source array split that all values are processed correctly
427
+ hash_params = {"region" => {'ids' => ["7", "3", "--", "6,8"]}}
428
+ hash_session = {"region"=>{"ids"=>["1", "2", "3", "4"], 'id'=>'11'}}
429
+ DeepMerge::deep_merge!(hash_params, hash_session)
430
+ assert_equal({'region' => {'ids' => ["1", "2", "3", "4", "7", "--", "6,8"], 'id'=>'11'}}, hash_session)
431
+
432
+ # Example: src = {'key' => "--1"}, dst = {'key' => "1"} -> merges to {'key' => ""}
433
+ hash_params = {"amenity"=>"--1"}
434
+ hash_session = {"amenity"=>"1"}
435
+ DeepMerge::deep_merge!(hash_params, hash_session, {:knockout_prefix => FIELD_KNOCKOUT_PREFIX})
436
+ assert_equal({"amenity"=>""}, hash_session)
437
+
438
+ # Example: src = {'key' => "--1"}, dst = {'key' => "2"} -> merges to {'key' => ""}
439
+ hash_params = {"amenity"=>"--1"}
440
+ hash_session = {"amenity"=>"2"}
441
+ DeepMerge::deep_merge!(hash_params, hash_session, {:knockout_prefix => FIELD_KNOCKOUT_PREFIX})
442
+ assert_equal({"amenity"=>""}, hash_session)
443
+
444
+ # Example: src = {'key' => "--1"}, dst = {'key' => "1"} -> merges to {'key' => ""}
445
+ hash_params = {"amenity"=>["--1"]}
446
+ hash_session = {"amenity"=>"1"}
447
+ DeepMerge::deep_merge!(hash_params, hash_session, {:knockout_prefix => FIELD_KNOCKOUT_PREFIX})
448
+ assert_equal({"amenity"=>[]}, hash_session)
449
+
450
+ # Example: src = {'key' => "--1"}, dst = {'key' => "1"} -> merges to {'key' => ""}
451
+ hash_params = {"amenity"=>["--1"]}
452
+ hash_session = {"amenity"=>["1"]}
453
+ DeepMerge::deep_merge!(hash_params, hash_session, {:knockout_prefix => FIELD_KNOCKOUT_PREFIX})
454
+ assert_equal({"amenity"=>[]}, hash_session)
455
+
456
+ # Example: src = {'key' => "--1"}, dst = {'key' => "1"} -> merges to {'key' => ""}
457
+ hash_params = {"amenity"=>"--1"}
458
+ hash_session = {}
459
+ DeepMerge::deep_merge!(hash_params, hash_session, {:knockout_prefix => FIELD_KNOCKOUT_PREFIX})
460
+ assert_equal({"amenity"=>""}, hash_session)
461
+
462
+
463
+ # Example: src = {'key' => "--1"}, dst = {'key' => "1"} -> merges to {'key' => ""}
464
+ hash_params = {"amenity"=>"--1"}
465
+ hash_session = {"amenity"=>["1"]}
466
+ DeepMerge::deep_merge!(hash_params, hash_session, {:knockout_prefix => FIELD_KNOCKOUT_PREFIX})
467
+ assert_equal({"amenity"=>""}, hash_session)
468
+
469
+ #are unmerged hashes passed unmodified w/out :unpack_arrays?
470
+ hash_params = {"amenity"=>{"id"=>["26,27"]}}
471
+ hash_session = {}
472
+ DeepMerge::deep_merge!(hash_params, hash_session, {:knockout_prefix => FIELD_KNOCKOUT_PREFIX})
473
+ assert_equal({"amenity"=>{"id"=>["26,27"]}}, hash_session)
474
+
475
+ #hash should be merged
476
+ hash_params = {"amenity"=>{"id"=>["26,27"]}}
477
+ hash_session = {}
478
+ DeepMerge::deep_merge!(hash_params, hash_session, {:knockout_prefix => FIELD_KNOCKOUT_PREFIX, :unpack_arrays => ","})
479
+ assert_equal({"amenity"=>{"id"=>["26","27"]}}, hash_session)
480
+
481
+ # second merge of same values should result in no change in output
482
+ hash_params = {"amenity"=>{"id"=>["26,27"]}}
483
+ DeepMerge::deep_merge!(hash_params, hash_session, {:knockout_prefix => FIELD_KNOCKOUT_PREFIX, :unpack_arrays => ","})
484
+ assert_equal({"amenity"=>{"id"=>["26","27"]}}, hash_session)
485
+
486
+ #hashes with knockout values are suppressed
487
+ hash_params = {"amenity"=>{"id"=>["#{FIELD_KNOCKOUT_PREFIX}26,#{FIELD_KNOCKOUT_PREFIX}27,28"]}}
488
+ hash_session = {}
489
+ DeepMerge::deep_merge!(hash_params, hash_session, {:knockout_prefix => FIELD_KNOCKOUT_PREFIX, :unpack_arrays => ","})
490
+ assert_equal({"amenity"=>{"id"=>["28"]}}, hash_session)
491
+
492
+ hash_src= {'region' =>{'ids'=>['--']}, 'query_uuid' => 'zzz'}
493
+ hash_dst= {'region' =>{'ids'=>['227','2','3','3']}, 'query_uuid' => 'zzz'}
494
+ DeepMerge::deep_merge!(hash_src, hash_dst, {:knockout_prefix => '--', :unpack_arrays => ","})
495
+ assert_equal({'region' =>{'ids'=>[]}, 'query_uuid' => 'zzz'}, hash_dst)
496
+
497
+ hash_src= {'region' =>{'ids'=>['--']}, 'query_uuid' => 'zzz'}
498
+ hash_dst= {'region' =>{'ids'=>['227','2','3','3'], 'id' => '3'}, 'query_uuid' => 'zzz'}
499
+ DeepMerge::deep_merge!(hash_src, hash_dst, {:knockout_prefix => '--', :unpack_arrays => ","})
500
+ assert_equal({'region' =>{'ids'=>[], 'id'=>'3'}, 'query_uuid' => 'zzz'}, hash_dst)
501
+
502
+ hash_src= {'region' =>{'ids'=>['--']}, 'query_uuid' => 'zzz'}
503
+ hash_dst= {'region' =>{'muni_city_id' => '2244', 'ids'=>['227','2','3','3'], 'id'=>'3'}, 'query_uuid' => 'zzz'}
504
+ DeepMerge::deep_merge!(hash_src, hash_dst, {:knockout_prefix => '--', :unpack_arrays => ","})
505
+ assert_equal({'region' =>{'muni_city_id' => '2244', 'ids'=>[], 'id'=>'3'}, 'query_uuid' => 'zzz'}, hash_dst)
506
+
507
+ hash_src= {'region' =>{'ids'=>['--'], 'id' => '5'}, 'query_uuid' => 'zzz'}
508
+ hash_dst= {'region' =>{'muni_city_id' => '2244', 'ids'=>['227','2','3','3'], 'id'=>'3'}, 'query_uuid' => 'zzz'}
509
+ DeepMerge::deep_merge!(hash_src, hash_dst, {:knockout_prefix => '--', :unpack_arrays => ","})
510
+ assert_equal({'region' =>{'muni_city_id' => '2244', 'ids'=>[], 'id'=>'5'}, 'query_uuid' => 'zzz'}, hash_dst)
511
+
512
+ hash_src= {'region' =>{'ids'=>['--', '227'], 'id' => '5'}, 'query_uuid' => 'zzz'}
513
+ hash_dst= {'region' =>{'muni_city_id' => '2244', 'ids'=>['227','2','3','3'], 'id'=>'3'}, 'query_uuid' => 'zzz'}
514
+ DeepMerge::deep_merge!(hash_src, hash_dst, {:knockout_prefix => '--', :unpack_arrays => ","})
515
+ assert_equal({'region' =>{'muni_city_id' => '2244', 'ids'=>['227'], 'id'=>'5'}, 'query_uuid' => 'zzz'}, hash_dst)
516
+
517
+ hash_src= {'region' =>{'muni_city_id' => '--', 'ids'=>'--', 'id'=>'5'}, 'query_uuid' => 'zzz'}
518
+ hash_dst= {'region' =>{'muni_city_id' => '2244', 'ids'=>['227','2','3','3'], 'id'=>'3'}, 'query_uuid' => 'zzz'}
519
+ DeepMerge::deep_merge!(hash_src, hash_dst, {:knockout_prefix => '--', :unpack_arrays => ","})
520
+ assert_equal({'region' =>{'muni_city_id' => '', 'ids'=>'', 'id'=>'5'}, 'query_uuid' => 'zzz'}, hash_dst)
521
+
522
+ hash_src= {'region' =>{'muni_city_id' => '--', 'ids'=>['--'], 'id'=>'5'}, 'query_uuid' => 'zzz'}
523
+ hash_dst= {'region' =>{'muni_city_id' => '2244', 'ids'=>['227','2','3','3'], 'id'=>'3'}, 'query_uuid' => 'zzz'}
524
+ DeepMerge::deep_merge!(hash_src, hash_dst, {:knockout_prefix => '--', :unpack_arrays => ","})
525
+ assert_equal({'region' =>{'muni_city_id' => '', 'ids'=>[], 'id'=>'5'}, 'query_uuid' => 'zzz'}, hash_dst)
526
+
527
+ hash_src= {'region' =>{'muni_city_id' => '--', 'ids'=>['--','227'], 'id'=>'5'}, 'query_uuid' => 'zzz'}
528
+ hash_dst= {'region' =>{'muni_city_id' => '2244', 'ids'=>['227','2','3','3'], 'id'=>'3'}, 'query_uuid' => 'zzz'}
529
+ DeepMerge::deep_merge!(hash_src, hash_dst, {:knockout_prefix => '--', :unpack_arrays => ","})
530
+ assert_equal({'region' =>{'muni_city_id' => '', 'ids'=>['227'], 'id'=>'5'}, 'query_uuid' => 'zzz'}, hash_dst)
531
+
532
+ hash_src = {"muni_city_id"=>"--", "id"=>""}
533
+ hash_dst = {"muni_city_id"=>"", "id"=>""}
534
+ DeepMerge::deep_merge!(hash_src, hash_dst, {:knockout_prefix => '--', :unpack_arrays => ","})
535
+ assert_equal({"muni_city_id"=>"", "id"=>""}, hash_dst)
536
+
537
+ hash_src = {"region"=>{"muni_city_id"=>"--", "id"=>""}}
538
+ hash_dst = {"region"=>{"muni_city_id"=>"", "id"=>""}}
539
+ DeepMerge::deep_merge!(hash_src, hash_dst, {:knockout_prefix => '--', :unpack_arrays => ","})
540
+ assert_equal({"region"=>{"muni_city_id"=>"", "id"=>""}}, hash_dst)
541
+
542
+ hash_src = {"query_uuid"=>"a0dc3c84-ec7f-6756-bdb0-fff9157438ab", "url_regions"=>[], "region"=>{"muni_city_id"=>"--", "id"=>""}, "property"=>{"property_type_id"=>"", "search_rate_min"=>"", "search_rate_max"=>""}, "task"=>"search", "run_query"=>"Search"}
543
+ hash_dst = {"query_uuid"=>"a0dc3c84-ec7f-6756-bdb0-fff9157438ab", "url_regions"=>[], "region"=>{"muni_city_id"=>"", "id"=>""}, "property"=>{"property_type_id"=>"", "search_rate_min"=>"", "search_rate_max"=>""}, "task"=>"search", "run_query"=>"Search"}
544
+ DeepMerge::deep_merge!(hash_src, hash_dst, {:knockout_prefix => '--', :unpack_arrays => ","})
545
+ assert_equal({"query_uuid"=>"a0dc3c84-ec7f-6756-bdb0-fff9157438ab", "url_regions"=>[], "region"=>{"muni_city_id"=>"", "id"=>""}, "property"=>{"property_type_id"=>"", "search_rate_min"=>"", "search_rate_max"=>""}, "task"=>"search", "run_query"=>"Search"}, hash_dst)
546
+
547
+ # hash of array of hashes
548
+ hash_src = {"item" => [{"1" => "3"}, {"2" => "4"}]}
549
+ hash_dst = {"item" => [{"3" => "5"}]}
550
+ DeepMerge::deep_merge!(hash_src, hash_dst)
551
+ assert_equal({"item" => [{"3" => "5"}, {"1" => "3"}, {"2" => "4"}]}, hash_dst)
552
+ end # test_deep_merge
553
+ end