scarpe 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (251) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +7 -1
  3. data/CHANGELOG.md +36 -4
  4. data/Gemfile +2 -1
  5. data/Gemfile.lock +13 -3
  6. data/LICENSE.txt +7 -1
  7. data/README.md +77 -14
  8. data/Rakefile +67 -0
  9. data/examples/Edit_box_Styles.rb +8 -0
  10. data/examples/Kerning.rb +7 -0
  11. data/examples/border.rb +11 -0
  12. data/examples/check.rb +2 -0
  13. data/examples/download_and_show_image.rb +3 -0
  14. data/examples/flags/finland.rb +15 -0
  15. data/examples/flags/italy.rb +11 -0
  16. data/examples/flags/mauritius.rb +14 -0
  17. data/examples/font_family.rb +17 -0
  18. data/examples/font_shorthand.rb +9 -0
  19. data/examples/gen.rb +4 -0
  20. data/examples/legacy/not_checked/shoes-manual/append.rb +10 -0
  21. data/examples/legacy/not_checked/shoes-manual/background_change.rb +12 -0
  22. data/examples/legacy/not_checked/shoes-manual/background_pattern.rb +5 -0
  23. data/examples/legacy/not_checked/shoes-manual/basic_app.rb +8 -0
  24. data/examples/legacy/not_checked/shoes-manual/border.rb +9 -0
  25. data/examples/legacy/not_checked/shoes-manual/builtins/FONTS.rb +5 -0
  26. data/examples/legacy/not_checked/shoes-manual/builtins/ask.rb +2 -0
  27. data/examples/legacy/not_checked/shoes-manual/builtins/ask_color.rb +5 -0
  28. data/examples/legacy/not_checked/shoes-manual/builtins/ask_open_file.rb +5 -0
  29. data/examples/legacy/not_checked/shoes-manual/builtins/ask_save_folder.rb +2 -0
  30. data/examples/legacy/not_checked/shoes-manual/builtins/confirm.rb +4 -0
  31. data/examples/legacy/not_checked/shoes-manual/builtins/debug.rb +2 -0
  32. data/examples/legacy/not_checked/shoes-manual/builtins/info.rb +3 -0
  33. data/examples/legacy/not_checked/shoes-manual/button.rb +9 -0
  34. data/examples/legacy/not_checked/shoes-manual/clear.rb +7 -0
  35. data/examples/legacy/not_checked/shoes-manual/custom_header.rb +13 -0
  36. data/examples/legacy/not_checked/shoes-manual/displace.rb +14 -0
  37. data/examples/legacy/not_checked/shoes-manual/edit_box.rb +8 -0
  38. data/examples/legacy/not_checked/shoes-manual/fill_pattern.rb +5 -0
  39. data/examples/legacy/not_checked/shoes-manual/fonts.rb +7 -0
  40. data/examples/legacy/not_checked/shoes-manual/gutter.rb +6 -0
  41. data/examples/legacy/not_checked/shoes-manual/image_web.rb +4 -0
  42. data/examples/legacy/not_checked/shoes-manual/keypress.rb +7 -0
  43. data/examples/legacy/not_checked/shoes-manual/list_box.rb +10 -0
  44. data/examples/legacy/not_checked/shoes-manual/motion.rb +10 -0
  45. data/examples/legacy/not_checked/shoes-manual/mouse.rb +8 -0
  46. data/examples/legacy/not_checked/shoes-manual/move.rb +14 -0
  47. data/examples/legacy/not_checked/shoes-manual/nested_ovals.rb +8 -0
  48. data/examples/legacy/not_checked/shoes-manual/oval.rb +7 -0
  49. data/examples/legacy/not_checked/shoes-manual/ovals.rb +6 -0
  50. data/examples/legacy/not_checked/shoes-manual/ovals_image.rb +8 -0
  51. data/examples/legacy/not_checked/shoes-manual/prepend.rb +7 -0
  52. data/examples/legacy/not_checked/shoes-manual/progress_bar.rb +10 -0
  53. data/examples/legacy/not_checked/shoes-manual/radio.rb +18 -0
  54. data/examples/legacy/not_checked/shoes-manual/radio_alternative_1.rb +7 -0
  55. data/examples/legacy/not_checked/shoes-manual/radio_alternative_2.rb +9 -0
  56. data/examples/legacy/not_checked/shoes-manual/rotate_rectangle.rb +6 -0
  57. data/examples/legacy/not_checked/shoes-manual/shape.rb +11 -0
  58. data/examples/legacy/not_checked/shoes-manual/static/avatar.png +0 -0
  59. data/examples/legacy/not_checked/shoes-manual/stroke.rb +5 -0
  60. data/examples/legacy/not_checked/shoes-manual/style.rb +3 -0
  61. data/examples/legacy/not_checked/shoes-manual/style_alternative_1.rb +4 -0
  62. data/examples/legacy/not_checked/shoes-manual/style_alternative_2.rb +5 -0
  63. data/examples/legacy/not_checked/shoes-manual/style_length.rb +5 -0
  64. data/examples/legacy/not_checked/shoes-manual/timer.rb +6 -0
  65. data/examples/legacy/not_checked/shoes-manual/trigger_window.rb +8 -0
  66. data/examples/legacy/not_checked/shoes-manual/window_owner.rb +8 -0
  67. data/examples/legacy/working/shoes_manual/alert_button.rb +2 -0
  68. data/examples/legacy/working/shoes_manual/animate.rb +7 -0
  69. data/examples/legacy/working/shoes_manual/background_para.rb +4 -0
  70. data/examples/legacy/working/shoes_manual/button_alternative.rb +7 -0
  71. data/examples/legacy/working/shoes_manual/checkbox.rb +17 -0
  72. data/examples/legacy/working/shoes_manual/download.rb +12 -0
  73. data/examples/legacy/working/shoes_manual/edit_box.rb +6 -0
  74. data/examples/legacy/working/shoes_manual/editline.rb +7 -0
  75. data/examples/legacy/working/shoes_manual/fixed_height.rb +8 -0
  76. data/examples/legacy/working/shoes_manual/fixed_width.rb +12 -0
  77. data/examples/legacy/working/shoes_manual/image.rb +5 -0
  78. data/examples/legacy/working/shoes_manual/instance_variable_check.rb +10 -0
  79. data/examples/legacy/working/shoes_manual/message.rb +18 -0
  80. data/examples/legacy/working/shoes_manual/rectangle.rb +6 -0
  81. data/examples/legacy/working/shoes_manual/save_download.rb +12 -0
  82. data/examples/legacy/working/shoes_manual/self_check.rb +10 -0
  83. data/examples/legacy/working/shoes_manual/stack.rb +7 -0
  84. data/examples/legacy/working/shoes_manual/style_info.rb +8 -0
  85. data/examples/legacy/working/shoes_manual/utf8_support.rb +8 -0
  86. data/examples/legacy/working/shoes_manual/width.rb +4 -0
  87. data/examples/local_assets/multi_image.rb +5 -0
  88. data/examples/local_assets/small.png +0 -0
  89. data/examples/local_fonts.rb +3 -0
  90. data/examples/margin.rb +13 -0
  91. data/examples/margin_check.rb +27 -0
  92. data/examples/oval-with-kwargs.rb +3 -0
  93. data/examples/oval.rb +26 -0
  94. data/examples/para_font_styles.rb +17 -0
  95. data/examples/para_font_variant.rb +6 -0
  96. data/examples/para_fontweight.rb +13 -0
  97. data/examples/parse_xl_funnies.rb +3 -0
  98. data/examples/rect.rb +1 -1
  99. data/examples/scarpe_ext.rb +3 -0
  100. data/examples/shapes/star.rb +1 -3
  101. data/examples/spacing.rb +1 -1
  102. data/examples/span.rb +4 -2
  103. data/lacci/lacci.gemspec +2 -2
  104. data/lacci/lib/lacci/scarpe_cli.rb +0 -1
  105. data/lacci/lib/lacci/version.rb +1 -1
  106. data/lacci/lib/scarpe/niente/display_service.rb +5 -1
  107. data/lacci/lib/scarpe/niente/drawable.rb +2 -0
  108. data/lacci/lib/scarpe/niente/shoes_spec.rb +7 -1
  109. data/lacci/lib/scarpe/niente.rb +14 -2
  110. data/lacci/lib/shoes/app.rb +44 -50
  111. data/lacci/lib/shoes/constants.rb +23 -2
  112. data/lacci/lib/shoes/display_service.rb +43 -4
  113. data/lacci/lib/shoes/drawable.rb +309 -35
  114. data/lacci/lib/shoes/drawables/arc.rb +2 -24
  115. data/lacci/lib/shoes/drawables/arrow.rb +2 -22
  116. data/lacci/lib/shoes/drawables/border.rb +28 -0
  117. data/lacci/lib/shoes/drawables/button.rb +4 -20
  118. data/lacci/lib/shoes/drawables/check.rb +7 -3
  119. data/lacci/lib/shoes/drawables/document_root.rb +4 -4
  120. data/lacci/lib/shoes/drawables/edit_box.rb +6 -5
  121. data/lacci/lib/shoes/drawables/edit_line.rb +5 -4
  122. data/lacci/lib/shoes/drawables/flow.rb +3 -5
  123. data/lacci/lib/shoes/drawables/font_helper.rb +62 -0
  124. data/lacci/lib/shoes/drawables/image.rb +2 -2
  125. data/lacci/lib/shoes/drawables/line.rb +4 -7
  126. data/lacci/lib/shoes/drawables/link.rb +5 -8
  127. data/lacci/lib/shoes/drawables/list_box.rb +8 -5
  128. data/lacci/lib/shoes/drawables/oval.rb +48 -0
  129. data/lacci/lib/shoes/drawables/para.rb +106 -18
  130. data/lacci/lib/shoes/drawables/progress.rb +2 -1
  131. data/lacci/lib/shoes/drawables/radio.rb +5 -3
  132. data/lacci/lib/shoes/drawables/rect.rb +5 -4
  133. data/lacci/lib/shoes/drawables/shape.rb +2 -1
  134. data/lacci/lib/shoes/drawables/slot.rb +99 -8
  135. data/lacci/lib/shoes/drawables/stack.rb +6 -11
  136. data/lacci/lib/shoes/drawables/star.rb +8 -30
  137. data/lacci/lib/shoes/drawables/text_drawable.rb +93 -34
  138. data/lacci/lib/shoes/drawables/video.rb +3 -2
  139. data/lacci/lib/shoes/drawables/widget.rb +8 -3
  140. data/lacci/lib/shoes/drawables.rb +2 -1
  141. data/lacci/lib/shoes/errors.rb +13 -3
  142. data/lacci/lib/shoes/margin_helper.rb +79 -0
  143. data/lacci/lib/shoes.rb +4 -3
  144. data/lacci/test/.gitignore +1 -0
  145. data/lacci/test/test_draw_context.rb +167 -0
  146. data/lacci/test/test_font_helper.rb +57 -0
  147. data/lacci/test/test_helper.rb +31 -4
  148. data/lacci/test/test_lacci.rb +93 -6
  149. data/lacci/test/test_margin_helper.rb +82 -0
  150. data/lacci/test/test_niente_test_infra.rb +26 -0
  151. data/lacci/test/test_oval.rb +82 -0
  152. data/lacci/test/test_parenting.rb +140 -0
  153. data/lacci/test/test_text_drawables.rb +23 -0
  154. data/lib/scarpe/assets.rb +18 -0
  155. data/lib/scarpe/cats_cradle.rb +57 -98
  156. data/lib/scarpe/shoes_spec.rb +22 -43
  157. data/lib/scarpe/version.rb +1 -1
  158. data/lib/scarpe/wv/app.rb +1 -0
  159. data/lib/scarpe/wv/arc.rb +0 -4
  160. data/lib/scarpe/wv/border.rb +15 -0
  161. data/lib/scarpe/wv/control_interface.rb +2 -10
  162. data/lib/scarpe/wv/document_root.rb +2 -2
  163. data/lib/scarpe/wv/drawable.rb +6 -40
  164. data/lib/scarpe/wv/edit_box.rb +4 -1
  165. data/lib/scarpe/wv/edit_line.rb +5 -2
  166. data/lib/scarpe/wv/image.rb +2 -5
  167. data/lib/scarpe/wv/link.rb +4 -2
  168. data/lib/scarpe/wv/oval.rb +13 -0
  169. data/lib/scarpe/wv/para.rb +1 -0
  170. data/lib/scarpe/wv/scarpe_extensions.rb +8 -0
  171. data/lib/scarpe/wv/shape.rb +10 -5
  172. data/lib/scarpe/wv/text_drawable.rb +72 -14
  173. data/lib/scarpe/wv/web_wrangler.rb +33 -11
  174. data/lib/scarpe/wv/webview_local_display.rb +6 -2
  175. data/lib/scarpe/wv.rb +8 -1
  176. data/scarpe-components/Gemfile +4 -1
  177. data/scarpe-components/Gemfile.lock +2 -3
  178. data/scarpe-components/README.md +2 -2
  179. data/scarpe-components/assets/bootstrap-themes/bootstrap-cerulean.css +12229 -0
  180. data/scarpe-components/assets/bootstrap-themes/bootstrap-cosmo.css +11810 -0
  181. data/scarpe-components/assets/bootstrap-themes/bootstrap-cyborg.css +12210 -0
  182. data/scarpe-components/assets/bootstrap-themes/bootstrap-darkly.css +12153 -0
  183. data/scarpe-components/assets/bootstrap-themes/bootstrap-flatly.css +12126 -0
  184. data/scarpe-components/assets/bootstrap-themes/bootstrap-icons.min.css +5 -0
  185. data/scarpe-components/assets/bootstrap-themes/bootstrap-journal.css +12099 -0
  186. data/scarpe-components/assets/bootstrap-themes/bootstrap-litera.css +12211 -0
  187. data/scarpe-components/assets/bootstrap-themes/bootstrap-lumen.css +12369 -0
  188. data/scarpe-components/assets/bootstrap-themes/bootstrap-lux.css +11928 -0
  189. data/scarpe-components/assets/bootstrap-themes/bootstrap-materia.css +13184 -0
  190. data/scarpe-components/assets/bootstrap-themes/bootstrap-minty.css +12177 -0
  191. data/scarpe-components/assets/bootstrap-themes/bootstrap-morph.css +12750 -0
  192. data/scarpe-components/assets/bootstrap-themes/bootstrap-pulse.css +11890 -0
  193. data/scarpe-components/assets/bootstrap-themes/bootstrap-quartz.css +12622 -0
  194. data/scarpe-components/assets/bootstrap-themes/bootstrap-sandstone.css +12201 -0
  195. data/scarpe-components/assets/bootstrap-themes/bootstrap-simplex.css +12186 -0
  196. data/scarpe-components/assets/bootstrap-themes/bootstrap-sketchy.css +12451 -0
  197. data/scarpe-components/assets/bootstrap-themes/bootstrap-slate.css +12492 -0
  198. data/scarpe-components/assets/bootstrap-themes/bootstrap-solar.css +12149 -0
  199. data/scarpe-components/assets/bootstrap-themes/bootstrap-spacelab.css +12266 -0
  200. data/scarpe-components/assets/bootstrap-themes/bootstrap-superhero.css +12216 -0
  201. data/scarpe-components/assets/bootstrap-themes/bootstrap-united.css +12077 -0
  202. data/scarpe-components/assets/bootstrap-themes/bootstrap-vapor.css +12549 -0
  203. data/scarpe-components/assets/bootstrap-themes/bootstrap-yeti.css +12325 -0
  204. data/scarpe-components/assets/bootstrap-themes/bootstrap-zephyr.css +12283 -0
  205. data/scarpe-components/assets/bootstrap-themes/bootstrap.bundle.min.js +7 -0
  206. data/scarpe-components/lib/scarpe/components/asset_server.rb +219 -0
  207. data/scarpe-components/lib/scarpe/components/base64.rb +22 -0
  208. data/scarpe-components/lib/scarpe/components/calzini/{art_widgets.rb → art_drawables.rb} +42 -18
  209. data/scarpe-components/lib/scarpe/components/calzini/border.rb +38 -0
  210. data/scarpe-components/lib/scarpe/components/calzini/button.rb +6 -8
  211. data/scarpe-components/lib/scarpe/components/calzini/misc.rb +7 -17
  212. data/scarpe-components/lib/scarpe/components/calzini/para.rb +213 -11
  213. data/scarpe-components/lib/scarpe/components/calzini/slots.rb +14 -60
  214. data/scarpe-components/lib/scarpe/components/calzini.rb +88 -1
  215. data/scarpe-components/lib/scarpe/components/errors.rb +4 -0
  216. data/scarpe-components/lib/scarpe/components/html.rb +4 -1
  217. data/scarpe-components/lib/scarpe/components/minitest_export_reporter.rb +11 -3
  218. data/scarpe-components/lib/scarpe/components/minitest_result.rb +41 -0
  219. data/scarpe-components/lib/scarpe/components/print_logger.rb +17 -2
  220. data/scarpe-components/lib/scarpe/components/process_helpers.rb +37 -0
  221. data/scarpe-components/lib/scarpe/components/segmented_file_loader.rb +1 -1
  222. data/scarpe-components/lib/scarpe/components/tiranti.rb +42 -100
  223. data/scarpe-components/lib/scarpe/components/unit_test_helpers.rb +3 -1
  224. data/scarpe-components/lib/scarpe/components/version.rb +1 -1
  225. data/scarpe-components/test/assets/big-image.png +0 -0
  226. data/scarpe-components/test/assets/big-stylesheet.css +497 -0
  227. data/scarpe-components/test/assets/little-image.png +0 -0
  228. data/scarpe-components/test/assets/little-stylesheet.css +1 -0
  229. data/scarpe-components/test/calzini/test_calzini_art_drawables.rb +7 -7
  230. data/scarpe-components/test/calzini/test_calzini_button.rb +7 -5
  231. data/scarpe-components/test/calzini/test_calzini_misc.rb +9 -9
  232. data/scarpe-components/test/calzini/test_calzini_para.rb +6 -9
  233. data/scarpe-components/test/calzini/test_calzini_slots.rb +12 -57
  234. data/scarpe-components/test/calzini/test_calzini_text_drawables.rb +83 -18
  235. data/scarpe-components/test/calzini/test_various.rb +133 -0
  236. data/scarpe-components/test/test_asset_server.rb +72 -0
  237. data/scarpe-components/test/test_components.rb +31 -2
  238. data/scarpe-components/test/test_helper.rb +0 -1
  239. data/scarpe-components/test/test_minitest_result.rb +7 -0
  240. data/scarpe-components/test/test_segmented_app_files.rb +2 -0
  241. data/tasks/check_html_fixtures.rb +140 -0
  242. data/tasks/regenerate_html_fixtures.rb +104 -0
  243. data/templates/class_template_with_shapes.erb +0 -11
  244. metadata +180 -32
  245. data/lacci/lib/scarpe/niente/logger.rb +0 -29
  246. data/lacci/lib/shoes/drawables/span.rb +0 -27
  247. data/lacci/lib/shoes/spacing.rb +0 -9
  248. data/lib/scarpe/evented_assertions.rb +0 -121
  249. data/lib/scarpe/wv/span.rb +0 -44
  250. data/scarpe-components/lib/scarpe/components/calzini/text_widgets.rb +0 -65
  251. /data/examples/legacy/{not_checked → working}/shoes3-tests/editline/editline.rb +0 -0
@@ -7,15 +7,19 @@ class TestCalziniPara < Minitest::Test
7
7
  @calzini = CalziniRenderer.new
8
8
  end
9
9
 
10
- # Note that Calzini doesn't render the text items for itself.
11
10
  def test_para_simple
12
11
  assert_equal %{<p id="elt-1">OK</p>},
13
12
  @calzini.render("para", {}) { "OK" }
14
13
  end
15
14
 
15
+ def test_para_with_align
16
+ assert_equal %{<div id=\"elt-1\" style=\"text-align:right;width:100%\"><p>OK</p></div>},
17
+ @calzini.render("para", { "align" => "right" }) { "OK" }
18
+ end
19
+
16
20
  def test_para_with_stroke_and_font
17
21
  assert_equal %{<p id="elt-1" style="color:#FF0000;font-family:Lucida">OK</p>},
18
- @calzini.render("para", { "stroke" => [1.0, 0.0, 0.0], "font" => "Lucida" }) { "OK" }
22
+ @calzini.render("para", { "stroke" => [1.0, 0.0, 0.0], "family" => "Lucida" }) { "OK" }
19
23
  end
20
24
 
21
25
  def test_para_with_string_banner
@@ -27,11 +31,4 @@ class TestCalziniPara < Minitest::Test
27
31
  assert_equal %{<p id="elt-1" style="font-size:48px"></p>},
28
32
  @calzini.render("para", { "size" => :banner })
29
33
  end
30
-
31
- # Eventually this should probably need to be marked as a Scarpe extension, here or
32
- # elsewhere.
33
- def test_para_with_html_attributes
34
- assert_equal %{<p avocado="true" class="avocado_bearing" id="elt-1"></p>},
35
- @calzini.render("para", { "html_attributes" => { "avocado" => true, "class" => "avocado_bearing" } })
36
- end
37
34
  end
@@ -7,124 +7,79 @@ class TestCalziniSlots < Minitest::Test
7
7
  @calzini = CalziniRenderer.new
8
8
  @stack_default_style = %{display:flex;flex-direction:column;align-content:flex-start;justify-content:flex-start;align-items:flex-start}
9
9
  @flow_default_style = %{display:flex;flex-direction:row;flex-wrap:wrap;align-content:flex-start;justify-content:flex-start;align-items:flex-start}
10
+ @inner_div_tag = %{<div style="height:100%;width:100%;position:relative">}
10
11
  end
11
12
 
12
13
  def test_stack_simple
13
14
  assert_equal %{<div id="elt-1" } +
14
15
  %{style="#{@stack_default_style}">} +
15
- %{contents</div>},
16
+ %{#{@inner_div_tag}contents</div></div>},
16
17
  @calzini.render("stack", {}) { "contents" }
17
18
  end
18
19
 
19
20
  def test_flow_simple
20
21
  assert_equal %{<div id="elt-1" } +
21
22
  %{style="#{@flow_default_style}">} +
22
- %{contents</div>},
23
+ %{#{@inner_div_tag}contents</div></div>},
23
24
  @calzini.render("flow", {}) { "contents" }
24
25
  end
25
26
 
26
27
  def test_docroot_simple
27
28
  assert_equal %{<div id="elt-1" } +
28
29
  %{style="#{@flow_default_style}">} +
29
- %{contents</div>},
30
+ %{#{@inner_div_tag}contents</div></div>},
30
31
  @calzini.render("documentroot", {}) { "contents" }
31
32
  end
32
33
 
33
34
  def test_stack_border_plain_color
34
35
  assert_equal %{<div id="elt-1" } +
35
36
  %{style="#{@stack_default_style};border-style:solid;border-width:1px;border-radius:0px;border-color:red">} +
36
- %{contents</div>},
37
+ %{#{@inner_div_tag}contents</div></div>},
37
38
  @calzini.render("stack", { "border_color" => "red" }) { "contents" }
38
39
  end
39
40
 
40
41
  def test_stack_border_gradient
41
42
  assert_equal %{<div id="elt-1" } +
42
43
  %{style="#{@stack_default_style};border-style:solid;border-width:1px;border-radius:0px;border-image:linear-gradient(45deg, red, green)">} +
43
- %{contents</div>},
44
+ %{#{@inner_div_tag}contents</div></div>},
44
45
  @calzini.render("stack", { "border_color" => ("red".."green") }) { "contents" }
45
46
  end
46
47
 
47
48
  def test_stack_border_rgba
48
49
  assert_equal %{<div id="elt-1" } +
49
50
  %{style="#{@stack_default_style};border-style:solid;border-width:1px;border-radius:0px;border-color:rgba(1.0, 0.0, 0.0, 1.0)">} +
50
- %{contents</div>},
51
+ %{#{@inner_div_tag}contents</div></div>},
51
52
  @calzini.render("stack", { "border_color" => [1.0, 0.0, 0.0, 1.0] }) { "contents" }
52
53
  end
53
54
 
54
55
  def test_stack_border_attrs
55
56
  assert_equal %{<div id="elt-1" } +
56
57
  %{style="#{@stack_default_style};border-style:solid;border-width:3px;border-radius:2px;border-color:red">} +
57
- %{contents</div>},
58
+ %{#{@inner_div_tag}contents</div></div>},
58
59
  @calzini.render("stack", { "border_color" => "red", "options" => { "strokewidth" => 3, "curve" => 2 } }) { "contents" }
59
60
  end
60
61
 
61
- def test_stack_margin
62
- assert_equal %{<div id="elt-1" } +
63
- %{style="#{@stack_default_style};margin:25px">} +
64
- %{contents</div>},
65
- @calzini.render("stack", { "margin" => 25 }) { "contents" }
66
- end
67
-
68
- def test_stack_options_margin
69
- assert_equal %{<div id="elt-1" } +
70
- %{style="#{@stack_default_style};margin:15px">} +
71
- %{contents</div>},
72
- @calzini.render("stack", { "options" => { "margin" => 15 } }) { "contents" }
73
- end
74
-
75
- def test_stack_margin_overrides_options
76
- assert_equal %{<div id="elt-1" } +
77
- %{style="#{@stack_default_style};margin:25px">} +
78
- %{contents</div>},
79
- @calzini.render("stack", { "margin" => 25, "options" => { "margin" => 15 } }) { "contents" }
80
- end
81
62
 
82
63
  def test_stack_padding
83
64
  assert_equal %{<div id="elt-1" } +
84
65
  %{style="#{@stack_default_style};padding:25px">} +
85
- %{contents</div>},
66
+ %{#{@inner_div_tag}contents</div></div>},
86
67
  @calzini.render("stack", { "padding" => 25 }) { "contents" }
87
68
  end
88
69
 
89
70
  def test_stack_options_padding
90
71
  assert_equal %{<div id="elt-1" } +
91
72
  %{style="#{@stack_default_style};padding:15px">} +
92
- %{contents</div>},
73
+ %{#{@inner_div_tag}contents</div></div>},
93
74
  @calzini.render("stack", { "options" => { "padding" => 15 } }) { "contents" }
94
75
  end
95
76
 
96
77
  def test_stack_padding_overrides_options
97
78
  assert_equal %{<div id="elt-1" } +
98
79
  %{style="#{@stack_default_style};padding:25px">} +
99
- %{contents</div>},
80
+ %{#{@inner_div_tag}contents</div></div>},
100
81
  @calzini.render("stack", { "padding" => 25, "options" => { "padding" => 15 } }) { "contents" }
101
82
  end
102
83
 
103
- def test_stack_options_hash_margin
104
- assert_equal %{<div id="elt-1" } +
105
- %{style="#{@stack_default_style};margin-left:5px;margin-right:10px;margin-top:15px;margin-bottom:20px">} +
106
- %{contents</div>},
107
- @calzini.render("stack", { "margin" => { left: 5, right: 10, top: 15, bottom: 20 } }) { "contents" }
108
- end
109
-
110
- def test_stack_options_array_margin
111
- assert_equal %{<div id="elt-1" } +
112
- %{style="#{@stack_default_style};margin-left:5px;margin-right:10px;margin-top:15px;margin-bottom:20px">} +
113
- %{contents</div>},
114
- @calzini.render("stack", { "margin" => [5, 10, 15, 20] }) { "contents" }
115
- end
116
-
117
- def test_stack_options_margin_left_overrides_options
118
- assert_equal %{<div id="elt-1" } +
119
- %{style="#{@stack_default_style};margin-left:25px">} +
120
- %{contents</div>},
121
- @calzini.render("stack", { "margin_left" => 25, "options" => { "margin" => 15 } }) { "contents" }
122
- end
123
-
124
- def test_stack_margin_left_overrides_margin
125
- assert_equal %{<div id="elt-1" } +
126
- %{style="#{@stack_default_style};margin:25px;margin-left:15px">} +
127
- %{contents</div>},
128
- @calzini.render("stack", { "margin" => 25, "margin_left" => 15 }) { "contents" }
129
- end
84
+
130
85
  end
@@ -7,35 +7,100 @@ class TestCalziniTextDrawables < Minitest::Test
7
7
  @calzini = CalziniRenderer.new
8
8
  end
9
9
 
10
- def test_link_simple
11
- assert_equal %{<a id="elt-1" href="https://google.com">click here</a>},
12
- @calzini.render("link", { "click" => "https://google.com", "text" => "click here" })
10
+ def trim_html_ids(s)
11
+ s.gsub(/ class="id_\d+"/, "")
13
12
  end
14
13
 
15
- def test_link_block
16
- assert_equal %{<a id="elt-1" onclick="handle('click')">click here</a>},
17
- @calzini.render("link", { "has_block" => true, "text" => "click here" })
14
+ def test_text_only_drawable
15
+ assert_equal %{this is text},
16
+ @calzini.render("text_drawable", ["this ", "is", " text"])
18
17
  end
19
18
 
20
- def test_span_simple
21
- assert_equal %{<span id="elt-1" style="color:red;font-size:48px;font-family:Lucida">big red</span>},
22
- @calzini.render("span", { "stroke" => "red", "size" => :banner, "font" => "Lucida" }) { "big red" }
19
+ def test_simple_text_drawable_with_em
20
+ assert_equal %{this <em class="id_1">is</em> text},
21
+ @calzini.render("text_drawable",
22
+ ["this ", { tag: "em", html_id: "1", items: ["is"], props: {}}, " text"])
23
23
  end
24
24
 
25
- def test_span_html_attributes
26
- assert_equal %{<span class="biggreen" id="elt-1" style="color:green;font-size:48px">big green</span>},
27
- @calzini.render("span", { "stroke" => "green", "size" => "banner", "html_attributes" => { "class" => "biggreen" } }) { "big green" }
25
+ # Span doesn't have default properties, so it's good for testing how a property is rendered
26
+ def test_simple_text_drawable_with_span_styles
27
+ assert_equal %{this <span style="color:#FF00FF;background-color:#0000FF;font-size:13px;font-family:Lucida">is</span> text},
28
+ trim_html_ids(@calzini.render("text_drawable",
29
+ ["this ", {
30
+ tag: "span",
31
+ html_id: "1",
32
+ items: ["is"],
33
+ props: {
34
+ "family" => "Lucida",
35
+ "size" => 13,
36
+ "stroke" => "#FF00FF",
37
+ "fill" => "#0000FF"
38
+ }
39
+ }, " text"]))
28
40
  end
29
41
 
30
- def test_code_simple
31
- assert_equal %{<code>Hello</code>}, @calzini.render("code", {}) { "Hello" }
42
+ def test_link_with_has_block
43
+ assert_equal %{this <a onclick="handle('click')">is</a> text},
44
+ trim_html_ids(@calzini.render("text_drawable",
45
+ ["this ", {
46
+ tag: "a",
47
+ html_id: "1",
48
+ items: ["is"],
49
+ props: {
50
+ "has_block" => true,
51
+ }
52
+ }, " text"]))
32
53
  end
33
54
 
34
- def test_em_simple
35
- assert_equal %{<em>Hello</em>}, @calzini.render("em", {}) { "Hello" }
55
+ def test_link_with_click
56
+ assert_equal %{this <a href="#" onclick="handle('click')">is</a> text},
57
+ trim_html_ids(@calzini.render("text_drawable",
58
+ ["this ", {
59
+ tag: "a",
60
+ html_id: "1",
61
+ items: ["is"],
62
+ props: {
63
+ "has_block" => true,
64
+ "click" => "#",
65
+ }
66
+ }, " text"]))
36
67
  end
37
68
 
38
- def test_strong_simple
39
- assert_equal %{<strong>Hello</strong>}, @calzini.render("strong", {}) { "Hello" }
69
+ def test_del_tag
70
+ assert_equal %{this <del>is</del> text},
71
+ trim_html_ids(@calzini.render("text_drawable",
72
+ ["this ", {
73
+ tag: "del",
74
+ html_id: "1",
75
+ items: ["is"],
76
+ props: {
77
+ }
78
+ }, " text"]))
79
+ end
80
+
81
+ def test_single_strikethrough
82
+ assert_equal %{this <span style="text-decoration-line:line-through">is</span> text},
83
+ trim_html_ids(@calzini.render("text_drawable",
84
+ ["this ", {
85
+ tag: "span",
86
+ html_id: "1",
87
+ items: ["is"],
88
+ props: {
89
+ "strikethrough" => "single",
90
+ }
91
+ }, " text"]))
92
+ end
93
+
94
+ def test_single_strikethrough_none
95
+ assert_equal %{this <span>is</span> text},
96
+ trim_html_ids(@calzini.render("text_drawable",
97
+ ["this ", {
98
+ tag: "span",
99
+ html_id: "1",
100
+ items: ["is"],
101
+ props: {
102
+ "strikethrough" => "none",
103
+ }
104
+ }, " text"]))
40
105
  end
41
106
  end
@@ -0,0 +1,133 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "../test_helper"
4
+
5
+ # Some tests don't cover just a single drawable.
6
+ class TestVariousCalzini < Minitest::Test
7
+ def setup
8
+ @calzini = CalziniRenderer.new
9
+ end
10
+
11
+ # Test data. For each drawable, include
12
+ # a minimal set of properties to create something
13
+ # basic and default. Then we can add to it and
14
+ # test the resulting HTML.
15
+ #
16
+ # In Shoes3, the vast majority of drawables support
17
+ # both stroke and fill. Here's the list from the
18
+ # Shoes manual minus the ones we already test here:
19
+ #
20
+ # background, banner, caption,
21
+ # code, del, em, flow, image, ins, inscription,
22
+ # link, mask, para, shape, span, stack,
23
+ # strong, sub, sup, subtitle, tagline, title
24
+ #
25
+ # Scarpe doesn't yet support the property on everything.
26
+ # but as we support it, we should add the drawables
27
+ # here.
28
+ #
29
+ CALZINI_ART_DRAWABLES = {
30
+ arc: {
31
+ has_stroke: false,
32
+ has_fill: false,
33
+ props: {
34
+ "width" => 200,
35
+ "height" => 150,
36
+ "left" => 17,
37
+ "top" => 42,
38
+ "angle1" => 3.14 / 2,
39
+ "angle2" => 3.14 / 4,
40
+ },
41
+ },
42
+ arrow: {
43
+ has_stroke: true,
44
+ has_fill: true,
45
+ props: {
46
+ "left" => 10,
47
+ "top" => 20,
48
+ "width" => 5,
49
+ },
50
+ },
51
+ line: {
52
+ has_stroke: true,
53
+ has_fill: false,
54
+ props: {
55
+ "top" => "4",
56
+ "left" => "7",
57
+ "x1" => "20",
58
+ "y1" => "17",
59
+ "x2" => "100",
60
+ "y2" => "104",
61
+ },
62
+ },
63
+ rect: {
64
+ has_stroke: true,
65
+ has_fill: true,
66
+ props: {
67
+ "top" => "9",
68
+ "left" => "12",
69
+ "width" => "147",
70
+ "height" => "91",
71
+ "draw_context" => {},
72
+ },
73
+ },
74
+ star: {
75
+ has_stroke: true,
76
+ has_fill: true,
77
+ props: {
78
+ "points" => 5,
79
+ "outer" => 2.0,
80
+ "inner" => 1.0,
81
+ },
82
+ },
83
+ oval: {
84
+ has_stroke: true,
85
+ has_fill: true,
86
+ props: {
87
+ "left" => 10,
88
+ "top" => 7,
89
+ "radius" => 5,
90
+ },
91
+ },
92
+ }
93
+
94
+ # This method tests some basic ways of setting strokes and fills and makes sure they
95
+ # work for different drawables. TODO: add more drawables. TODO: either add testing for
96
+ # setting stroke and fill directly vs. draw-context, or remove draw-context.
97
+ def test_color_conversion
98
+ CALZINI_ART_DRAWABLES.each do |name, h|
99
+ basic = @calzini.render(name.to_s, h[:props])
100
+ assert !basic.include?("#FF0000"), "Un-colored #{name} shouldn't already have red or we'll get a false positive!"
101
+
102
+ if h[:has_stroke]
103
+ red_stroke = @calzini.render(name.to_s, h[:props].merge("stroke" => [255, 0, 0, 255]))
104
+ assert_includes red_stroke, "#FF0000", "With integer-array red stroke, #{name} should contain red color!"
105
+
106
+ red_stroke = @calzini.render(name.to_s, h[:props].merge("draw_context" => { "stroke" => [255, 0, 0, 255] }))
107
+ assert_includes red_stroke, "#FF0000", "With integer-array red stroke, #{name} should contain red color!"
108
+
109
+ red_stroke = @calzini.render(name.to_s, h[:props].merge("stroke" => [255, 0, 0, 255], "draw_context" => { "stroke" => [0, 255, 0, 255] }))
110
+ assert_includes red_stroke, "#FF0000", "Red stroke should take precedence over green, #{name} should contain red color!"
111
+
112
+ # TODO: later, after issue #504 is fixed, colors should turn into their hex equivalent
113
+ red_stroke = @calzini.render(name.to_s, h[:props].merge("stroke" => "red"))
114
+ assert_includes red_stroke, "red", "With integer-array red stroke, #{name} should contain red color!"
115
+ end
116
+
117
+ if h[:has_fill]
118
+ red_fill = @calzini.render(name.to_s, h[:props].merge("fill" => [255, 0, 0, 255]))
119
+ assert_includes red_fill, "#FF0000", "With integer-array red fill, #{name} should contain red color!"
120
+
121
+ red_fill = @calzini.render(name.to_s, h[:props].merge("draw_context" => { "fill" => [255, 0, 0, 255] }))
122
+ assert_includes red_fill, "#FF0000", "With integer-array red fill, #{name} should contain red color!"
123
+
124
+ red_fill = @calzini.render(name.to_s, h[:props].merge("fill" => [255, 0, 0, 255], "draw_context" => { "fill" => [0, 255, 0, 255] }))
125
+ assert_includes red_fill, "#FF0000", "Red fill should take precedence over green, #{name} should contain red color!"
126
+
127
+ # TODO: later, after issue #504 is fixed, colors should turn into their hex equivalent
128
+ red_fill = @calzini.render(name.to_s, h[:props].merge("fill" => "red"))
129
+ assert_includes red_fill, "red", "With integer-array red fill, #{name} should contain red color!"
130
+ end
131
+ end
132
+ end
133
+ end
@@ -0,0 +1,72 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "test_helper"
4
+
5
+ require "scarpe/components/asset_server"
6
+
7
+ class TestAssetServer < Minitest::Test
8
+ def teardown
9
+ @server = nil # Don't keep the same server object from run to run, just in case
10
+ end
11
+
12
+ def fake_server
13
+ # We don't need to check HTTP connections, we just want to generate URLs
14
+ @server ||= Scarpe::Components::AssetServer.new port: 4444, app_dir: __dir__, never_start_server: true
15
+ end
16
+
17
+ def weird_dir_server
18
+ # Use a deeper app root to test files outside the app's directory
19
+ @server ||= Scarpe::Components::AssetServer.new port: 4444, app_dir: "#{__dir__}/subdir", never_start_server: true
20
+ end
21
+
22
+ def test_small_image_explicit_data_url
23
+ url = fake_server.asset_url("#{__dir__}/assets/little-image.png", url_type: :data)
24
+ assert url.start_with?("data:image/png;base64,"), "Data URL for image should start with image/png! #{url.inspect}"
25
+ end
26
+
27
+ def test_small_css_explicit_data_url
28
+ url = fake_server.asset_url("#{__dir__}/assets/little-stylesheet.css", url_type: :data)
29
+ assert url.start_with?("data:text/css;base64,"), "Data URL for CSS should start with text/css! #{url.inspect}"
30
+ end
31
+
32
+ def test_small_css_auto_data_url
33
+ url = fake_server.asset_url("#{__dir__}/assets/little-stylesheet.css")
34
+ assert url.start_with?("data:text/css;base64,"), "Small CSS files should get a data URL by default! #{url.inspect}"
35
+ end
36
+
37
+ def test_small_css_explicit_app_dir_asset_url
38
+ url = fake_server.asset_url("#{__dir__}/assets/little-stylesheet.css", url_type: :asset)
39
+ assert_equal "http://127.0.0.1:4444/app/assets/little-stylesheet.css", url, "Small CSS files should get an asset URL by request!"
40
+ end
41
+
42
+ def test_small_css_explicit_component_asset_url
43
+ url = weird_dir_server.asset_url("#{__dir__}/assets/little-stylesheet.css", url_type: :asset)
44
+ assert_equal "http://127.0.0.1:4444/comp/test/assets/little-stylesheet.css", url, "Small CSS files should get an asset URL by request!"
45
+ end
46
+
47
+ def test_large_app_file_auto_asset_url
48
+ url = fake_server.asset_url("#{__dir__}/assets/big-image.png")
49
+ assert_equal "http://127.0.0.1:4444/app/assets/big-image.png", url, "Big image files should get an asset URL by default!"
50
+ end
51
+
52
+ def test_large_app_file_explicit_asset_url
53
+ url = fake_server.asset_url("#{__dir__}/assets/big-image.png", url_type: :asset)
54
+ assert_equal "http://127.0.0.1:4444/app/assets/big-image.png", url, "Big image files should get an asset URL by default!"
55
+ end
56
+
57
+ def test_large_app_file_explicit_data_url
58
+ url = fake_server.asset_url("#{__dir__}/assets/big-image.png", url_type: :data)
59
+ assert url.start_with?("data:image/png;base64,"), "Big image files should get a data URL by request! #{url.inspect}"
60
+ end
61
+
62
+ def test_large_file_outside_dirs
63
+ url = fake_server.asset_url("#{__dir__}/../../docs/static/man-builds.png")
64
+ assert url.start_with?("data:image/png;base64,"), "Large files outside dirs should still use data URLs"
65
+ end
66
+
67
+ def test_large_file_outside_dirs_with_exception
68
+ assert_raises Scarpe::OperationNotAllowedError do
69
+ url = fake_server.asset_url("#{__dir__}/../../docs/static/man-builds.png", url_type: :asset)
70
+ end
71
+ end
72
+ end
@@ -3,7 +3,36 @@
3
3
  require_relative "test_helper"
4
4
 
5
5
  class TestScarpeComponents < Minitest::Test
6
- def test_truth
7
- assert_equal true, true
6
+ # Top-level tests go here?
7
+ end
8
+
9
+ require "scarpe/components/process_helpers"
10
+ class TestComponentHelpers < Minitest::Test
11
+ include Scarpe::Components::ProcessHelpers
12
+
13
+ def test_process_runner_stdout
14
+ out, err, success = run_out_err_result("echo ok")
15
+ assert success, "Echoing okay should succeed!"
16
+ assert_equal "", err
17
+ assert_includes out, "ok"
18
+ end
19
+
20
+ def test_process_runner_stderr
21
+ out, err, success = run_out_err_result("echo ok 1>&2")
22
+ assert success, "Echoing okay to stderr should succeed!"
23
+ assert_equal "", out
24
+ assert_includes err, "ok"
25
+ end
26
+
27
+ def test_process_runner_fail
28
+ out, err, success = run_out_err_result("ls no_such_file_exists")
29
+ assert !success, "ls on nonexistent file should return failure!"
30
+ assert_equal "", out
31
+ assert err != "", "ls on nonexistent file should give non-empty error output"
32
+ end
33
+
34
+ def test_process_runner_command_array
35
+ out, err, success = run_out_err_result(["echo", "ok"])
36
+ assert success, "Echoing okay via command array should succeed!"
8
37
  end
9
38
  end
@@ -39,5 +39,4 @@ class CalziniRenderer
39
39
  end
40
40
 
41
41
  class Minitest::Test
42
- include Scarpe::Test::Helpers
43
42
  end
@@ -58,4 +58,11 @@ class TestMinitestResult < Minitest::Test
58
58
  refute res.passed?
59
59
  assert_equal "Just skipping", res.skip_message
60
60
  end
61
+
62
+ def test_mtr_console_summary
63
+ path = File.join __dir__, "mtr_data/skipped_w_msg.json"
64
+ res = Scarpe::Components::MinitestResult.new(path)
65
+
66
+ assert res.console_summary.include?("Skip:")
67
+ end
61
68
  end
@@ -7,6 +7,8 @@ require "scarpe/components/segmented_file_loader"
7
7
  SEG_TEST_DATA = {}
8
8
 
9
9
  class TestSegmentedAppFiles < Minitest::Test
10
+ include Scarpe::Test::Helpers
11
+
10
12
  def setup
11
13
  @orig_file_loaders = Shoes.file_loaders
12
14
  Shoes.reset_file_loaders # create new loaders array with no overlap with @orig_file_loaders