masterview 0.2.5 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (155) hide show
  1. data/CHANGELOG +31 -1
  2. data/README +70 -69
  3. data/RELEASE_NOTES +70 -64
  4. data/Rakefile +26 -27
  5. data/TODO +13 -29
  6. data/doc/about.html +246 -0
  7. data/doc/configuration.html +49 -36
  8. data/doc/developer.html +423 -41
  9. data/doc/directives.html +139 -51
  10. data/doc/guide.html +19 -9
  11. data/doc/index.html +90 -224
  12. data/doc/installation.html +36 -28
  13. data/doc/media_list.html +30 -20
  14. data/doc/simple_diagram.html +3 -5
  15. data/doc/stylesheets/masterview.css +16 -1
  16. data/examples/rails_app_config/masterview/settings.rb +2 -1
  17. data/init.rb +1 -1
  18. data/lib/#ChangeLog# +6 -0
  19. data/lib/masterview/analyzer.rb +48 -34
  20. data/lib/masterview/attr_string_parser.rb +5 -1
  21. data/lib/masterview/case_insensitive_hash.rb +69 -0
  22. data/lib/masterview/{pathname_extensions.rb → core_ext/pathname.rb} +0 -0
  23. data/lib/masterview/{string_extensions.rb → core_ext/string.rb} +0 -0
  24. data/lib/masterview/deprecated/directive_base.rb +362 -0
  25. data/lib/masterview/directive_base.rb +201 -179
  26. data/lib/masterview/directive_dsl.rb +457 -0
  27. data/lib/masterview/directive_helpers.rb +28 -141
  28. data/lib/masterview/directive_load_path.rb +388 -0
  29. data/lib/masterview/directive_metadata.rb +377 -0
  30. data/lib/masterview/directive_registry.rb +259 -69
  31. data/lib/masterview/directives/.metadata +16 -0
  32. data/lib/masterview/directives/attr.rb +9 -8
  33. data/lib/masterview/directives/block.rb +11 -14
  34. data/lib/masterview/directives/check_box.rb +13 -18
  35. data/lib/masterview/directives/collection_select.rb +15 -29
  36. data/lib/masterview/directives/content.rb +9 -3
  37. data/lib/masterview/directives/else.rb +15 -13
  38. data/lib/masterview/directives/elsif.rb +14 -13
  39. data/lib/masterview/directives/eval.rb +20 -0
  40. data/lib/masterview/directives/form.rb +56 -9
  41. data/lib/masterview/directives/form_remote.rb +26 -0
  42. data/lib/masterview/directives/global_inline_erb.rb +10 -14
  43. data/lib/masterview/directives/hidden_field.rb +11 -20
  44. data/lib/masterview/directives/if.rb +13 -12
  45. data/lib/masterview/directives/image_tag.rb +20 -28
  46. data/lib/masterview/directives/import.rb +5 -12
  47. data/lib/masterview/directives/import_render.rb +7 -19
  48. data/lib/masterview/directives/insert_generated_comment.rb +8 -11
  49. data/lib/masterview/directives/javascript_include.rb +21 -12
  50. data/lib/masterview/directives/link_to.rb +14 -8
  51. data/lib/masterview/directives/link_to_function.rb +22 -0
  52. data/lib/masterview/directives/link_to_if.rb +15 -13
  53. data/lib/masterview/directives/link_to_remote.rb +13 -8
  54. data/lib/masterview/directives/omit_tag.rb +32 -16
  55. data/lib/masterview/directives/password_field.rb +10 -22
  56. data/lib/masterview/directives/radio_button.rb +11 -22
  57. data/lib/masterview/directives/replace.rb +7 -8
  58. data/lib/masterview/directives/select.rb +11 -24
  59. data/lib/masterview/directives/stylesheet_link.rb +20 -12
  60. data/lib/masterview/directives/submit.rb +11 -5
  61. data/lib/masterview/directives/text_area.rb +10 -23
  62. data/lib/masterview/directives/text_field.rb +10 -22
  63. data/lib/masterview/exceptions.rb +21 -0
  64. data/lib/masterview/extras/app/controllers/masterview_controller.rb +102 -75
  65. data/lib/masterview/extras/app/views/layouts/masterview_admin.rhtml +24 -23
  66. data/lib/masterview/extras/app/views/layouts/masterview_admin_config.rhtml +81 -0
  67. data/lib/masterview/extras/app/views/masterview/admin/configuration.rhtml +5 -1
  68. data/lib/masterview/extras/app/views/masterview/admin/create.rhtml +2 -2
  69. data/lib/masterview/extras/app/views/masterview/admin/directives.rhtml +5 -0
  70. data/lib/masterview/extras/app/views/masterview/admin/features.rhtml +5 -79
  71. data/lib/masterview/extras/app/views/masterview/admin/interact.rhtml +5 -0
  72. data/lib/masterview/extras/app/views/masterview/admin/list.rhtml +3 -71
  73. data/lib/masterview/extras/init_mv_admin_pages.rb +42 -23
  74. data/lib/masterview/filter_helpers.rb +26 -0
  75. data/lib/masterview/initializer.rb +99 -53
  76. data/lib/masterview/io.rb +19 -15
  77. data/lib/masterview/keyword_expander.rb +7 -2
  78. data/lib/masterview/masterview_info.rb +229 -23
  79. data/lib/masterview/masterview_version.rb +2 -2
  80. data/lib/masterview/parser.rb +275 -105
  81. data/lib/masterview/parser_helpers.rb +54 -0
  82. data/lib/masterview/rails_ext/action_controller_erb_direct.rb +29 -0
  83. data/lib/masterview/rails_ext/action_controller_reparse_checking.rb +27 -0
  84. data/lib/masterview/{extras/init_rails_erb_mv_direct.rb → rails_ext/action_view_erb_direct.rb} +12 -59
  85. data/lib/masterview/template_spec.rb +3 -2
  86. data/lib/masterview.rb +21 -12
  87. data/lib/rexml/parsers/baseparser_with_doctype_fix.rb +473 -0
  88. data/lib/rexml/parsers/sax2parser_with_doctype_fix.rb +243 -0
  89. data/test/directive_test_helper.rb +135 -0
  90. data/test/fixtures/directives/id_check.rb +18 -0
  91. data/test/fixtures/directives/test_directive_events.rb +70 -0
  92. data/test/test_helper.rb +18 -5
  93. data/test/tmp/views/layouts/product.rhtml +10 -10
  94. data/test/tmp/views/product/_form.rhtml +4 -4
  95. data/test/tmp/views/product/_product.rhtml +3 -3
  96. data/test/tmp/views/product/destroy.rhtml +5 -5
  97. data/test/tmp/views/product/edit.rhtml +4 -4
  98. data/test/tmp/views/product/list.rhtml +3 -3
  99. data/test/tmp/views/product/new.rhtml +4 -4
  100. data/test/tmp/views/product/show.rhtml +2 -2
  101. data/test/unit/attr_string_parser_test.rb +105 -0
  102. data/test/unit/case_insensitive_hash_mod_test.rb +104 -0
  103. data/test/unit/config_settings_test.rb +13 -1
  104. data/test/unit/default_generate_mio_filter_test.rb +3 -3
  105. data/test/unit/deprecated_directive_base_test.rb +30 -0
  106. data/test/unit/directive_attr_test.rb +111 -35
  107. data/test/unit/directive_base_test.rb +520 -1
  108. data/test/unit/directive_block_test.rb +30 -22
  109. data/test/unit/directive_content_test.rb +24 -11
  110. data/test/unit/directive_else_test.rb +18 -15
  111. data/test/unit/directive_elsif_test.rb +17 -15
  112. data/test/unit/directive_form_remote_test.rb +59 -0
  113. data/test/unit/directive_form_test.rb +31 -39
  114. data/test/unit/directive_global_inline_erb_test.rb +28 -17
  115. data/test/unit/directive_grid_test_notready.rb +38 -0
  116. data/test/unit/directive_helpers_test.rb +39 -0
  117. data/test/unit/directive_hidden_field_test.rb +44 -29
  118. data/test/unit/directive_if_test.rb +10 -7
  119. data/test/unit/directive_image_tag_test.rb +69 -61
  120. data/test/unit/directive_import_render_test.rb +28 -38
  121. data/test/unit/directive_import_test.rb +16 -14
  122. data/test/unit/directive_insert_generated_comment_test.rb +32 -0
  123. data/test/unit/directive_javascript_include_test.rb +40 -43
  124. data/test/unit/directive_link_to_function_test.rb +40 -0
  125. data/test/unit/directive_link_to_if_test.rb +52 -12
  126. data/test/unit/directive_link_to_remote_test.rb +58 -0
  127. data/test/unit/directive_link_to_test.rb +46 -31
  128. data/test/unit/directive_load_path_test.rb +257 -0
  129. data/test/unit/directive_metadata_test.rb +313 -0
  130. data/test/unit/directive_omit_tag_test.rb +73 -21
  131. data/test/unit/directive_password_field_test.rb +44 -38
  132. data/test/unit/directive_registry_test.rb +44 -0
  133. data/test/unit/directive_replace_test.rb +28 -12
  134. data/test/unit/directive_stylesheet_link_test.rb +43 -36
  135. data/test/unit/directive_submit_test.rb +29 -30
  136. data/test/unit/directive_text_area_test.rb +40 -36
  137. data/test/unit/directive_text_field_test.rb +44 -38
  138. data/test/unit/example_directive_child_events_test.rb +41 -0
  139. data/test/unit/example_test.rb +31 -4
  140. data/test/unit/file_mio_test.rb +18 -13
  141. data/test/unit/filter_helpers_test.rb +10 -8
  142. data/test/unit/find_directive_parent_test.rb +174 -0
  143. data/test/unit/keyword_expander_test.rb +4 -2
  144. data/test/unit/mio_test.rb +18 -11
  145. data/test/unit/mtime_string_hash_mio_tree_test.rb +5 -1
  146. data/test/unit/parser_test.rb +41 -29
  147. data/test/unit/pathname_extensions_test.rb +1 -1
  148. data/test/unit/run_parser_test.rb +2 -2
  149. data/test/unit/simplified_directive_base_test.rb +256 -0
  150. data/test/unit/string_hash_mio_test.rb +5 -1
  151. data/test/unit/template_file_watcher_test.rb +2 -2
  152. data/test/unit/template_test.rb +221 -46
  153. metadata +86 -45
  154. data/lib/masterview/directives/testfilter.rb +0 -55
  155. data/lib/masterview/extras/init_rails_reparse_checking.rb +0 -62
@@ -3,8 +3,160 @@
3
3
  require 'test/unit'
4
4
  currentPath = File.dirname(__FILE__)
5
5
  require File.join( currentPath, '../../lib/masterview' )
6
+ require File.join( currentPath, '../test_helper' )
7
+
8
+ class DirectiveExample < MasterView::DirectiveBase
9
+ attr_arg :obj, :quote => true
10
+ attr_arg(:method) { 'override' }
11
+ attr_arg(:foo) { |x| x.downcase }
12
+ attr_arg :collection, :quote => true
13
+ attr_arg :value_method, :quote => true
14
+ attr_arg :text_method, :quote => true
15
+ attr_arg :options, :default => {}
16
+ attr_arg :html_options, :append_element_attrs => [:common_html, :onclick]
17
+
18
+ event :before_stag do
19
+ render erb_content( 'text_area', :obj, :method, :foo )
20
+ end
21
+
22
+ event :after_stag, :foo => :bar do
23
+ render :nothing
24
+ end
25
+
26
+ event :content, :render => :nothing #rolls up all content between after_stag and before_etag
27
+
28
+ event :stag do
29
+ # unless render something or render :nothing is called, then dcs.render will still occur implicitely
30
+ end
31
+
32
+ event :etag do
33
+ con = render_result() # get the dcs.render result so we can modify it
34
+ con.gsub!( /foo/, 'bar' )
35
+ render con
36
+ end
37
+
38
+ event :element do # this will allow replacement of entire element and children
39
+ render erb_eval( 'execute something' )
40
+ end
41
+ end
42
+
43
+ class DirectiveExampleNoStag < MasterView::DirectiveBase
44
+ event :before_stag do
45
+ render 'foo'
46
+ end
47
+
48
+ event :after_etag, :render => :nothing
49
+ end
50
+
51
+ class DirectiveExampleRenderNothingOption < MasterView::DirectiveBase
52
+ event :before_stag do
53
+ render 'foo'
54
+ end
55
+
56
+ event :stag, :render => :nothing
57
+
58
+ event :etag, :render => :nothing do
59
+ render 'this should not be rendered'
60
+ end
61
+ end
62
+
63
+ class DirectiveExampleRenderNothingContent < MasterView::DirectiveBase
64
+ event :stag do
65
+ self.content = 'this is content, but will not be rendered'
66
+ render 'foo'
67
+ end
68
+
69
+ event :content, :render => :nothing
70
+
71
+ event :etag do
72
+ render 'bar'
73
+ end
74
+ end
75
+
76
+ class DirectiveExampleRenderNothingElement < MasterView::DirectiveBase
77
+ event :stag do
78
+ self.content = 'this is content, but will not be rendered'
79
+ render 'foo'
80
+ end
81
+
82
+ event :etag do
83
+ render 'bar'
84
+ end
85
+
86
+ event :element, :render => :nothing
87
+ end
88
+
89
+ class DirectiveExampleRenderNothingMethod < MasterView::DirectiveBase
90
+ event :stag do
91
+ render 'this will be cancelled out by :nothing call'
92
+ render :nothing
93
+ end
94
+ end
95
+
96
+ class DirectiveExampleParamsArray < MasterView::DirectiveBase
97
+ attr_arg :obj
98
+ attr_arg :params, :varargs => true
99
+
100
+ event :stag do
101
+ render erb_content( 'foo', :obj, :params )
102
+ end
103
+ end
104
+
105
+ class DirectiveExampleNonhashFirstString < MasterView::DirectiveBase
106
+ attr_arg :name do |value, args|
107
+ if value.respond_to?(:include?) and value.include?('=>')
108
+ args.unshift value
109
+ nil
110
+ else
111
+ value
112
+ end
113
+ end
114
+
115
+ attr_arg :options
116
+ end
117
+
118
+
119
+ class DirectiveExampleInst < MasterView::DirectiveBase
120
+ attr_arg :name do |value, args, inst|
121
+ if value.respond_to?(:include?) and value.include?('=>')
122
+ args.unshift value
123
+ inst.quote(inst.element_attrs[:foo])
124
+ else
125
+ value
126
+ end
127
+ end
128
+
129
+ attr_arg :options
130
+
131
+ event :etag do
132
+ render erb_content( 'test', :name, :options )
133
+ end
134
+
135
+ end
136
+
137
+ class DirectiveWithChild < MasterView::DirectiveBase
138
+ event :before_child_td_stag do
139
+ end
140
+
141
+ event :child_any_etag do
142
+ end
143
+
144
+ event :descendant_th_content do
145
+ end
146
+
147
+ event :after_descendant_th_etag do
148
+ end
149
+
150
+ event :descendant_th_etag do
151
+ end
152
+ end
153
+
154
+ class TestDirectiveBaseNew < Test::Unit::TestCase
155
+
156
+ # shortcut refs for internal DirectiveDSL implementation classes
157
+ EventDef = MasterView::DirectiveProcessing::EventDef
158
+ RenderAccumulator = MasterView::DirectiveProcessing::RenderAccumulator
6
159
 
7
- class TestDirectiveBase < Test::Unit::TestCase
8
160
  def setup
9
161
  @base = MasterView::DirectiveBase.new('')
10
162
  end
@@ -13,6 +165,10 @@ class TestDirectiveBase < Test::Unit::TestCase
13
165
  assert_equal '\'hello\'', @base.quote('hello')
14
166
  end
15
167
 
168
+ def test_quote_double
169
+ assert_equal '"hello"', @base.quote('hello', '"')
170
+ end
171
+
16
172
  def test_quote_if
17
173
  assert_equal '\'helloWorld0123\'', @base.quote_if('helloWorld0123')
18
174
  assert_equal 'hello world', @base.quote_if('hello world')
@@ -26,4 +182,367 @@ class TestDirectiveBase < Test::Unit::TestCase
26
182
  assert_equal '\'\'', @base.quote_if('')
27
183
  end
28
184
 
185
+ def test_event_def_valid_mappings
186
+ assert EventDef.valid_event_mapping?( :before_stag )
187
+ assert EventDef.valid_event_mapping?( :stag )
188
+ assert EventDef.valid_event_mapping?( :after_stag )
189
+ assert EventDef.valid_event_mapping?( :content )
190
+ assert EventDef.valid_event_mapping?( :before_etag )
191
+ assert EventDef.valid_event_mapping?( :etag )
192
+ assert EventDef.valid_event_mapping?( :after_etag )
193
+ assert EventDef.valid_event_mapping?( :element )
194
+
195
+ assert EventDef.valid_event_mapping?( :before_child_td_stag )
196
+ assert EventDef.valid_event_mapping?( :child_td_stag )
197
+ assert EventDef.valid_event_mapping?( :after_child_td_stag )
198
+ assert EventDef.valid_event_mapping?( :child_td_content )
199
+ assert EventDef.valid_event_mapping?( :child_td_element )
200
+ assert EventDef.valid_event_mapping?( :before_child_any_stag )
201
+ assert EventDef.valid_event_mapping?( :child_any_stag )
202
+ assert EventDef.valid_event_mapping?( :after_child_any_stag )
203
+ assert EventDef.valid_event_mapping?( :child_any_content )
204
+ assert EventDef.valid_event_mapping?( :child_any_element )
205
+ assert EventDef.valid_event_mapping?( :before_child_tbody_td_stag )
206
+ assert EventDef.valid_event_mapping?( :child_tbody_td_stag )
207
+ assert EventDef.valid_event_mapping?( :after_child_tbody_td_stag )
208
+ assert EventDef.valid_event_mapping?( :child_tbody_td_content )
209
+ assert EventDef.valid_event_mapping?( :child_tbody_td_element )
210
+
211
+ assert EventDef.valid_event_mapping?( :before_descendant_td_stag )
212
+ assert EventDef.valid_event_mapping?( :descendant_td_stag )
213
+ assert EventDef.valid_event_mapping?( :after_descendant_td_stag )
214
+ assert EventDef.valid_event_mapping?( :descendant_td_content )
215
+ assert EventDef.valid_event_mapping?( :descendant_td_element )
216
+ assert EventDef.valid_event_mapping?( :before_descendant_any_stag )
217
+ assert EventDef.valid_event_mapping?( :descendant_any_stag )
218
+ assert EventDef.valid_event_mapping?( :after_descendant_any_stag )
219
+ assert EventDef.valid_event_mapping?( :descendant_any_content )
220
+ assert EventDef.valid_event_mapping?( :descendant_any_element )
221
+ assert EventDef.valid_event_mapping?( :before_descendant_tbody_td_stag )
222
+ assert EventDef.valid_event_mapping?( :descendant_tbody_td_stag )
223
+ assert EventDef.valid_event_mapping?( :after_descendant_tbody_td_stag )
224
+ assert EventDef.valid_event_mapping?( :descendant_tbody_td_content )
225
+ assert EventDef.valid_event_mapping?( :descendant_tbody_td_element )
226
+
227
+ assert !EventDef.valid_event_mapping?( :foo )
228
+ assert !EventDef.valid_event_mapping?( :child_bar )
229
+ assert !EventDef.valid_event_mapping?( :before_child_hello )
230
+ end
231
+
232
+ def test_event_def_base_method
233
+ assert_equal [:stag], EventDef.base_methods_from_event( :before_stag )
234
+ assert_equal [:stag], EventDef.base_methods_from_event( :stag )
235
+ assert_equal [:stag], EventDef.base_methods_from_event( :after_stag )
236
+ assert_equal [:etag], EventDef.base_methods_from_event( :content )
237
+ assert_equal [:etag], EventDef.base_methods_from_event( :before_etag )
238
+ assert_equal [:etag], EventDef.base_methods_from_event( :etag )
239
+ assert_equal [:etag], EventDef.base_methods_from_event( :after_etag )
240
+ assert_equal [:stag, :etag], EventDef.base_methods_from_event( :element )
241
+
242
+ assert_equal [:child_td_stag], EventDef.base_methods_from_event( :before_child_td_stag )
243
+ assert_equal [:child_td_stag], EventDef.base_methods_from_event( :child_td_stag )
244
+ assert_equal [:child_td_stag], EventDef.base_methods_from_event( :after_child_td_stag )
245
+ assert_equal [:child_td_etag], EventDef.base_methods_from_event( :child_td_content )
246
+ assert_equal [:child_td_stag, :child_td_etag], EventDef.base_methods_from_event( :child_td_element )
247
+ assert_equal [:child_any_stag], EventDef.base_methods_from_event( :before_child_any_stag )
248
+ assert_equal [:child_any_stag], EventDef.base_methods_from_event( :child_any_stag )
249
+ assert_equal [:child_any_stag], EventDef.base_methods_from_event( :after_child_any_stag )
250
+ assert_equal [:child_any_etag], EventDef.base_methods_from_event( :child_any_content )
251
+ assert_equal [:child_any_stag, :child_any_etag], EventDef.base_methods_from_event( :child_any_element )
252
+ assert_equal [:child_tbody_td_stag], EventDef.base_methods_from_event( :before_child_tbody_td_stag )
253
+ assert_equal [:child_tbody_td_stag], EventDef.base_methods_from_event( :child_tbody_td_stag )
254
+ assert_equal [:child_tbody_td_stag], EventDef.base_methods_from_event( :after_child_tbody_td_stag )
255
+ assert_equal [:child_tbody_td_etag], EventDef.base_methods_from_event( :child_tbody_td_content )
256
+ assert_equal [:child_tbody_td_stag, :child_tbody_td_etag], EventDef.base_methods_from_event( :child_tbody_td_element )
257
+
258
+ assert_equal [:descendant_td_stag], EventDef.base_methods_from_event( :before_descendant_td_stag )
259
+ assert_equal [:descendant_td_stag], EventDef.base_methods_from_event( :descendant_td_stag )
260
+ assert_equal [:descendant_td_stag], EventDef.base_methods_from_event( :after_descendant_td_stag )
261
+ assert_equal [:descendant_td_etag], EventDef.base_methods_from_event( :descendant_td_content )
262
+ assert_equal [:descendant_td_stag, :descendant_td_etag], EventDef.base_methods_from_event( :descendant_td_element )
263
+ assert_equal [:descendant_any_stag], EventDef.base_methods_from_event( :before_descendant_any_stag )
264
+ assert_equal [:descendant_any_stag], EventDef.base_methods_from_event( :descendant_any_stag )
265
+ assert_equal [:descendant_any_stag], EventDef.base_methods_from_event( :after_descendant_any_stag )
266
+ assert_equal [:descendant_any_etag], EventDef.base_methods_from_event( :descendant_any_content )
267
+ assert_equal [:descendant_any_stag, :descendant_any_etag], EventDef.base_methods_from_event( :descendant_any_element )
268
+ assert_equal [:descendant_tbody_td_stag], EventDef.base_methods_from_event( :before_descendant_tbody_td_stag )
269
+ assert_equal [:descendant_tbody_td_stag], EventDef.base_methods_from_event( :descendant_tbody_td_stag )
270
+ assert_equal [:descendant_tbody_td_stag], EventDef.base_methods_from_event( :after_descendant_tbody_td_stag )
271
+ assert_equal [:descendant_tbody_td_etag], EventDef.base_methods_from_event( :descendant_tbody_td_content )
272
+ assert_equal [:descendant_tbody_td_stag, :descendant_tbody_td_etag], EventDef.base_methods_from_event( :descendant_tbody_td_element )
273
+ end
274
+
275
+ def test_event_def_method_events_from_base
276
+ assert_equal [:before_stag, :stag, :after_stag], EventDef.method_events_from_base( :stag )
277
+ assert_equal [:before_child_td_stag, :child_td_stag, :after_child_td_stag], EventDef.method_events_from_base( :child_td_stag )
278
+ assert_equal [:before_child_any_stag, :child_any_stag, :after_child_any_stag], EventDef.method_events_from_base( :child_any_stag )
279
+ assert_equal [:before_child_tbody_td_stag, :child_tbody_td_stag, :after_child_tbody_td_stag], EventDef.method_events_from_base( :child_tbody_td_stag )
280
+ assert_equal [:before_descendant_td_stag, :descendant_td_stag, :after_descendant_td_stag], EventDef.method_events_from_base( :descendant_td_stag )
281
+ assert_equal [:before_descendant_tbody_td_stag, :descendant_tbody_td_stag, :after_descendant_tbody_td_stag], EventDef.method_events_from_base( :descendant_tbody_td_stag )
282
+
283
+ assert_equal [:content, :before_etag, :etag, :after_etag, :element], EventDef.method_events_from_base( :etag )
284
+ assert_equal [:child_tbody_td_content, :before_child_tbody_td_etag, :child_tbody_td_etag, :after_child_tbody_td_etag, :child_tbody_td_element], EventDef.method_events_from_base( :child_tbody_td_etag )
285
+ assert_equal [:descendant_td_content, :before_descendant_td_etag, :descendant_td_etag, :after_descendant_td_etag, :descendant_td_element], EventDef.method_events_from_base( :descendant_td_etag )
286
+ assert_equal [:descendant_tbody_td_content, :before_descendant_tbody_td_etag, :descendant_tbody_td_etag, :after_descendant_tbody_td_etag, :descendant_tbody_td_element], EventDef.method_events_from_base( :descendant_tbody_td_etag )
287
+ end
288
+
289
+
290
+ # return array of events to check for the base
291
+ # :stag => [:before_stag, :stag, :after_stag],
292
+ # :etag => [:content, :before_etag, :etag, :after_etag, :element]
293
+ # def self.method_events_from_base(base_sym)
294
+ # base_str = base_sym.to_s
295
+ # case base_str
296
+ # when /(.*)stag/
297
+ # [
298
+ # ('before_'+base_str).to_sym,
299
+ # base_sym,
300
+ # ('after_'+base_str).to_sym
301
+ # ]
302
+ # when /(.*)etag/
303
+ # [
304
+ # ('\1content').to_sym,
305
+ # ('before_'+base_str).to_sym,
306
+ # base_sym,
307
+ # ('after_'+base_str).to_sym,
308
+ # ('\1element').to_sym
309
+ # ]
310
+ # end
311
+ # end
312
+
313
+
314
+
315
+ def test_attr_arg_defs
316
+ assert_equal 8, DirectiveExample.directive_class_def.attr_arg_defs.size
317
+ assert_equal :obj, DirectiveExample.directive_class_def.attr_arg_defs[0].name
318
+ assert_equal :method, DirectiveExample.directive_class_def.attr_arg_defs[1].name
319
+ assert_equal :foo, DirectiveExample.directive_class_def.attr_arg_defs[2].name
320
+ assert_equal :collection, DirectiveExample.directive_class_def.attr_arg_defs[3].name
321
+ assert_equal :value_method, DirectiveExample.directive_class_def.attr_arg_defs[4].name
322
+ assert_equal :text_method, DirectiveExample.directive_class_def.attr_arg_defs[5].name
323
+ assert_equal :options, DirectiveExample.directive_class_def.attr_arg_defs[6].name
324
+ assert_equal :html_options, DirectiveExample.directive_class_def.attr_arg_defs[7].name
325
+
326
+ assert_equal :obj, DirectiveExample.directive_class_def.find_attr_arg_def_by_name(:obj).name
327
+ assert_equal :method, DirectiveExample.directive_class_def.find_attr_arg_def_by_name(:method).name
328
+ assert_equal :foo, DirectiveExample.directive_class_def.find_attr_arg_def_by_name(:foo).name
329
+ assert_equal :collection, DirectiveExample.directive_class_def.find_attr_arg_def_by_name(:collection).name
330
+ assert_equal :value_method, DirectiveExample.directive_class_def.find_attr_arg_def_by_name(:value_method).name
331
+ assert_equal :text_method, DirectiveExample.directive_class_def.find_attr_arg_def_by_name(:text_method).name
332
+ assert_equal :options, DirectiveExample.directive_class_def.find_attr_arg_def_by_name(:options).name
333
+ assert_equal :html_options, DirectiveExample.directive_class_def.find_attr_arg_def_by_name(:html_options).name
334
+
335
+ assert_equal( { :quote => true }, DirectiveExample.directive_class_def.attr_arg_defs[0].options )
336
+ assert_equal( { }, DirectiveExample.directive_class_def.attr_arg_defs[1].options )
337
+ assert_equal( { }, DirectiveExample.directive_class_def.attr_arg_defs[2].options )
338
+ assert_equal( { :quote => true }, DirectiveExample.directive_class_def.attr_arg_defs[3].options )
339
+ assert_equal( { :quote => true }, DirectiveExample.directive_class_def.attr_arg_defs[4].options )
340
+ assert_equal( { :quote => true }, DirectiveExample.directive_class_def.attr_arg_defs[5].options )
341
+ assert_equal( { :default => {} }, DirectiveExample.directive_class_def.attr_arg_defs[6].options )
342
+ assert_equal( {}, DirectiveExample.directive_class_def.attr_arg_defs[6].optional_default )
343
+ assert_equal( { :append_element_attrs => [:common_html, :onclick] }, DirectiveExample.directive_class_def.attr_arg_defs[7].options )
344
+ end
345
+
346
+ def test_prepare_arg_instance_vars
347
+ d = DirectiveExample.new('product, desc, "Foo", coll, val, text, {:foo => :bar}, :readonly => false')
348
+ d.save_directive_call_stack(MasterView::ParserMock.createMockDCS())
349
+ d.element_attrs['class'] = 'red'
350
+ d.element_attrs['id'] = 'id1'
351
+ d.element_attrs['onclick'] = 'jsfunc'
352
+ d.prepare_arg_instance_vars
353
+ assert_equal "'product'", d.instance_variable_get(:@obj)
354
+ assert_equal 'override', d.instance_variable_get(:@method)
355
+ assert_equal '"foo"', d.instance_variable_get(:@foo)
356
+ assert_equal "'coll'", d.instance_variable_get(:@collection)
357
+ assert_equal "'val'", d.instance_variable_get(:@value_method)
358
+ assert_equal "'text'", d.instance_variable_get(:@text_method)
359
+ assert_equal '{:foo => :bar}', d.instance_variable_get(:@options)
360
+ assert_equal ':readonly => false, :class => "red", :id => "id1", :onclick => "jsfunc"', d.instance_variable_get(:@html_options)
361
+ end
362
+
363
+ def test_params_array
364
+ d = DirectiveExampleParamsArray.new('product, desc, "Foo", coll, val, text, {:foo => :bar}, :readonly => false')
365
+ dcs = MasterView::ParserMock.createMockDCS()
366
+ d.save_directive_call_stack(dcs)
367
+ d.prepare_arg_instance_vars
368
+ assert_equal "product", d.instance_variable_get(:@obj)
369
+ assert_equal ['desc', '"Foo"', 'coll', 'val', 'text', '{:foo => :bar}', ':readonly => false'], d.instance_variable_get(:@params)
370
+
371
+ d = DirectiveExampleParamsArray.new('product, desc, hello, world')
372
+ dcs = MasterView::ParserMock.createMockDCS()
373
+ d.save_directive_call_stack(dcs)
374
+ assert_equal ['<%= foo( product, desc, hello, world ) %>'], d.stag(dcs)
375
+
376
+ d = DirectiveExampleParamsArray.new('product')
377
+ d.save_directive_call_stack(MasterView::ParserMock.createMockDCS())
378
+ d.prepare_arg_instance_vars
379
+ assert_equal "product", d.instance_variable_get(:@obj)
380
+ assert_equal [], d.instance_variable_get(:@params)
381
+
382
+ d = DirectiveExampleParamsArray.new('product')
383
+ dcs = MasterView::ParserMock.createMockDCS()
384
+ d.save_directive_call_stack(dcs)
385
+ assert_equal ['<%= foo( product ) %>'], d.stag(dcs)
386
+
387
+ d = DirectiveExampleParamsArray.new(":action => 'create'")
388
+ d.save_directive_call_stack(MasterView::ParserMock.createMockDCS())
389
+ d.prepare_arg_instance_vars
390
+ assert_equal ":action => 'create'", d.instance_variable_get(:@obj)
391
+ end
392
+
393
+ def test_nonhash_first_string
394
+ d = DirectiveExampleNonhashFirstString.new('foo, :bar => :baz')
395
+ dcs = MasterView::ParserMock.createMockDCS()
396
+ d.save_directive_call_stack(dcs)
397
+ d.prepare_arg_instance_vars
398
+ assert_equal "foo", d.instance_variable_get(:@name)
399
+ assert_equal ":bar => :baz", d.instance_variable_get(:@options)
400
+
401
+ d = DirectiveExampleNonhashFirstString.new(':bar => :baz')
402
+ dcs = MasterView::ParserMock.createMockDCS()
403
+ d.save_directive_call_stack(dcs)
404
+ d.prepare_arg_instance_vars
405
+ assert_nil d.instance_variable_get(:@name)
406
+ assert_equal ":bar => :baz", d.instance_variable_get(:@options)
407
+ end
408
+
409
+ def test_inst
410
+ d = DirectiveExampleInst.new(':bar => :baz')
411
+ dcs = MasterView::ParserMock.createMockDCS()
412
+ d.save_directive_call_stack(dcs)
413
+ d.element_attrs[:foo] = 'hello'
414
+ d.prepare_arg_instance_vars
415
+ assert_equal "'hello'", d.instance_variable_get(:@name)
416
+ assert_equal ":bar => :baz", d.instance_variable_get(:@options)
417
+ end
418
+
419
+ def test_event_defs
420
+ assert_equal 6, DirectiveExample.directive_class_def.event_defs.size
421
+ assert DirectiveExample.directive_class_def.event_defs[:before_stag]
422
+ assert DirectiveExample.directive_class_def.event_defs[:after_stag]
423
+ assert DirectiveExample.directive_class_def.event_defs[:stag]
424
+ assert DirectiveExample.directive_class_def.event_defs[:content]
425
+ assert DirectiveExample.directive_class_def.event_defs[:etag]
426
+ assert DirectiveExample.directive_class_def.event_defs[:element]
427
+ assert !DirectiveExample.directive_class_def.event_defs[:doesnt_exist]
428
+
429
+ assert_equal( {}, DirectiveExample.directive_class_def.event_defs[:before_stag].options )
430
+ assert_equal( {:foo => :bar}, DirectiveExample.directive_class_def.event_defs[:after_stag].options )
431
+ assert_equal( {}, DirectiveExample.directive_class_def.event_defs[:stag].options )
432
+ assert_equal( { :render => :nothing }, DirectiveExample.directive_class_def.event_defs[:content].options )
433
+ assert_equal( {}, DirectiveExample.directive_class_def.event_defs[:etag].options )
434
+ assert_equal( {}, DirectiveExample.directive_class_def.event_defs[:element].options )
435
+ end
436
+
437
+ def test_methods_defined
438
+ assert DirectiveExample.public_method_defined?(:stag)
439
+ assert DirectiveExample.public_method_defined?(:etag)
440
+ assert !DirectiveExample.public_method_defined?(:before_stag)
441
+ assert !DirectiveExample.public_method_defined?(:after_stag)
442
+ end
443
+
444
+ def test_render_accumulator
445
+ ra = RenderAccumulator.new
446
+ assert_equal [], ra.method_level_content_array
447
+ assert_equal [], ra.event_level_content_array
448
+ assert_equal false, ra.render_call_found
449
+ assert_nil ra.instance_variable_get(:@render_result)
450
+ assert_nil ra.instance_variable_get(:@render_result_block)
451
+
452
+ ra.add_to_event_content 'foo'
453
+ assert_equal [], ra.method_level_content_array
454
+ assert_equal ['foo'], ra.event_level_content_array
455
+ assert_equal true, ra.render_call_found
456
+
457
+ ra.add_to_event_content 'bar'
458
+ assert_equal [], ra.method_level_content_array
459
+ assert_equal ['foo', 'bar'], ra.event_level_content_array
460
+ assert_equal true, ra.render_call_found
461
+
462
+ ra.add_event_content_to_method_content
463
+ assert_equal ['foo', 'bar'], ra.method_level_content_array
464
+ assert_equal [], ra.event_level_content_array
465
+ assert_equal true, ra.render_call_found
466
+
467
+ ra.add_to_event_content 'hello'
468
+ ra.replace_all_method_content_with_event_content
469
+ assert_equal ['hello'], ra.method_level_content_array
470
+
471
+ ra.add_to_event_content 'hello'
472
+ ra.reset_event_level_vars
473
+ assert_equal [], ra.event_level_content_array
474
+ assert_equal false, ra.render_call_found
475
+ assert_nil ra.instance_variable_get(:@render_result)
476
+ assert_nil ra.instance_variable_get(:@render_result_block)
477
+
478
+ ra.render_result_block = lambda { ra.render_result = 'wow' }
479
+ assert_equal 'wow', ra.call_render_result_block
480
+ assert_equal 'wow', ra.instance_variable_get(:@render_result)
481
+ ra.render_result = 'changed'
482
+ assert_nil ra.instance_variable_get(:@render_result_block)
483
+ assert_equal 'changed', ra.instance_variable_get(:@render_result)
484
+ end
485
+
486
+ def test_no_stag
487
+ assert DirectiveExampleNoStag.public_method_defined?(:stag)
488
+ assert DirectiveExampleNoStag.public_method_defined?(:etag)
489
+ end
490
+
491
+ def test_event_defs_no_stag
492
+ assert_equal 4, DirectiveExampleNoStag.directive_class_def.event_defs.size
493
+ assert DirectiveExampleNoStag.directive_class_def.event_defs[:before_stag]
494
+ assert DirectiveExampleNoStag.directive_class_def.event_defs[:after_etag]
495
+ assert DirectiveExampleNoStag.directive_class_def.event_defs[:stag]
496
+ assert DirectiveExampleNoStag.directive_class_def.event_defs[:etag]
497
+ end
498
+
499
+ def test_nothing_option
500
+ d = DirectiveExampleRenderNothingOption.new('')
501
+ dcs = MasterView::ParserMock.createMockDCS()
502
+ d.save_directive_call_stack(dcs)
503
+ assert_equal ['foo'], d.stag(dcs)
504
+ assert_equal [], d.etag(dcs)
505
+ end
506
+
507
+ def test_nothing_option_content
508
+ d = DirectiveExampleRenderNothingContent.new('')
509
+ dcs = MasterView::ParserMock.createMockDCS()
510
+ d.save_directive_call_stack(dcs)
511
+ d.etag(dcs)
512
+ assert_equal nil, dcs.content
513
+ end
514
+
515
+ def test_nothing_option_element
516
+ d = DirectiveExampleRenderNothingElement.new('')
517
+ dcs = MasterView::ParserMock.createMockDCS()
518
+ d.save_directive_call_stack(dcs)
519
+ assert_equal ['foo'], d.stag(dcs)
520
+ assert_equal [], d.etag(dcs)
521
+ assert_equal nil, dcs.content
522
+ assert_equal nil, dcs.stag
523
+ end
524
+
525
+ def test_nothing_method
526
+ d = DirectiveExampleRenderNothingMethod.new('')
527
+ dcs = MasterView::ParserMock.createMockDCS()
528
+ d.save_directive_call_stack(dcs)
529
+ assert_equal [], d.stag(dcs)
530
+ end
531
+
532
+ def test_event_defs_for_child
533
+ assert_equal 6, DirectiveWithChild.directive_class_def.event_defs.size
534
+ assert DirectiveWithChild.directive_class_def.event_defs[:before_child_td_stag]
535
+ assert DirectiveWithChild.directive_class_def.event_defs[:child_td_stag]
536
+ assert DirectiveWithChild.directive_class_def.event_defs[:child_any_etag]
537
+ assert DirectiveWithChild.directive_class_def.event_defs[:descendant_th_content]
538
+ assert DirectiveWithChild.directive_class_def.event_defs[:after_descendant_th_etag]
539
+ assert DirectiveWithChild.directive_class_def.event_defs[:descendant_th_etag]
540
+ assert DirectiveWithChild.public_method_defined?(:child_td_stag)
541
+ assert DirectiveWithChild.public_method_defined?(:child_any_etag)
542
+ assert DirectiveWithChild.public_method_defined?(:descendant_th_etag)
543
+ end
544
+
545
+
546
+
547
+
29
548
  end
@@ -3,45 +3,53 @@
3
3
  require 'test/unit'
4
4
  currentPath = File.dirname(__FILE__)
5
5
  require File.join( currentPath, '../../lib/masterview' )
6
- require File.join( currentPath, '../../lib/masterview/directives/block')
6
+ #require File.join( currentPath, '../../lib/masterview/directives/block')
7
+ require File.join( currentPath, '../directive_test_helper' )
8
+ DirectiveTestHelpers.load_masterview_directive('block')
7
9
 
8
10
  class TestBlock < Test::Unit::TestCase
9
- include MasterView::Directives
11
+ include DirectiveTestHelpers
12
+
13
+ Block = MasterView::Directives::Block # test subject
14
+ DirectiveAttrName = Block.attribute_qname
15
+
16
+ ELEMENT_TAG = 'div'
10
17
 
11
18
  def setup
12
- @directives = MasterView::DirectiveSet.new
19
+ create_template_element ELEMENT_TAG
13
20
  end
14
21
 
15
- def test_do
16
- @directives.directives = []
22
+ def test_metadata
23
+ assert_equal MasterView::ConfigSettings.namespace_prefix, Block.namespace_prefix
24
+ end
25
+
26
+ def test_block_do_end_notation
17
27
  attr_value = 'if true do'
18
- @directives << Block.new(attr_value)
19
- assert_equal "<% #{attr_value} %>", @directives.determine_dcs(:stag).render.join
20
- assert_equal "<% end %>", @directives.determine_dcs(:etag).render.join
28
+ create_directive Block, attr_value
29
+ assert_equal "<% #{attr_value} -%>", render_element_event(:stag)
30
+ assert_equal "<% end -%>", render_element_event(:etag)
31
+
21
32
  end
22
33
 
23
- def test_brack
24
- @directives.directives = []
34
+ def test_block_braces_notation
25
35
  attr_value = 'if true {'
26
- @directives << Block.new(attr_value)
27
- assert_equal "<% #{attr_value} %>", @directives.determine_dcs(:stag).render.join
28
- assert_equal "<% } %>", @directives.determine_dcs(:etag).render.join
36
+ create_directive Block, attr_value
37
+ assert_equal "<% #{attr_value} -%>", render_element_event(:stag)
38
+ assert_equal "<% } -%>", render_element_event(:etag)
29
39
  end
30
40
 
31
41
  def test_brack2
32
- @directives.directives = []
33
42
  attr_value = 'if true { :foo => :bar } {'
34
- @directives << Block.new(attr_value)
35
- assert_equal "<% #{attr_value} %>", @directives.determine_dcs(:stag).render.join
36
- assert_equal "<% } %>", @directives.determine_dcs(:etag).render.join
43
+ create_directive Block, attr_value
44
+ assert_equal "<% #{attr_value} -%>", render_element_event(:stag)
45
+ assert_equal "<% } -%>", render_element_event(:etag)
37
46
  end
38
47
 
39
48
  def test_do2
40
- @directives.directives = []
41
49
  attr_value = 'if true { :foo => :bar } do'
42
- @directives << Block.new(attr_value)
43
- assert_equal 1, @directives.directives.size
44
- assert_equal "<% #{attr_value} %>", @directives.determine_dcs(:stag).render.join
45
- assert_equal "<% end %>", @directives.determine_dcs(:etag).render.join
50
+ create_directive Block, attr_value
51
+ assert_equal 1, element_directives.size #??why are we checking this?? [deb 05-Oct-2006]
52
+ assert_equal "<% #{attr_value} -%>", render_element_event(:stag)
53
+ assert_equal "<% end -%>", render_element_event(:etag)
46
54
  end
47
55
  end
@@ -3,24 +3,37 @@
3
3
  require 'test/unit'
4
4
  currentPath = File.dirname(__FILE__)
5
5
  require File.join( currentPath, '../../lib/masterview' )
6
- require File.join( currentPath, '../../lib/masterview/directives/content')
6
+ #require File.join( currentPath, '../../lib/masterview/directives/content')
7
+ require File.join( currentPath, '../directive_test_helper' )
8
+ DirectiveTestHelpers.load_masterview_directive('content')
7
9
 
8
10
  class TestContent < Test::Unit::TestCase
9
- include MasterView::Directives
11
+ include DirectiveTestHelpers
12
+
13
+ Content = MasterView::Directives::Content # test subject
14
+
15
+ ELEMENT_TAG = 'div'
16
+
17
+ def check_element_rendering(expected)
18
+
19
+ erbized_content = "<%= #{expected} %>"
20
+
21
+ #??what should we do/check for :stag, :content prcessing points???
22
+
23
+ assert_equal '', render_element_event(:etag)
24
+ assert_equal erbized_content, element_content
25
+ ###ISSUE: Needs work - this should be verifying that the original tags are preserved
10
26
 
11
- def setup
12
- @directives = MasterView::DirectiveSet.new
13
- @tag = MasterView::Tag.new(@directives, 'foo', {}, :normal, nil)
14
27
  end
15
28
 
16
29
  def test_hello
17
- @directives.directives = []
30
+
31
+ create_template_element ELEMENT_TAG
18
32
  attr_value = 'hello world'
19
- @directives << Content.new(attr_value)
20
- dcs = @directives.determine_dcs(:etag)
21
- dcs.context = @tag.create_context
22
- assert_equal '', dcs.render.join
23
- assert_equal "<%= #{attr_value} %>", dcs.context[:tag].content
33
+ create_directive Content, attr_value
34
+
35
+ check_element_rendering attr_value
36
+
24
37
  end
25
38
 
26
39
  end