scribble 1.0.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 (51) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +22 -0
  3. data/Gemfile +4 -0
  4. data/LICENSE.txt +22 -0
  5. data/README.md +455 -0
  6. data/Rakefile +2 -0
  7. data/lib/scribble.rb +44 -0
  8. data/lib/scribble/block.rb +25 -0
  9. data/lib/scribble/converter.rb +10 -0
  10. data/lib/scribble/errors.rb +24 -0
  11. data/lib/scribble/method.rb +91 -0
  12. data/lib/scribble/methods/if.rb +26 -0
  13. data/lib/scribble/methods/layout.rb +25 -0
  14. data/lib/scribble/methods/partial.rb +14 -0
  15. data/lib/scribble/methods/times.rb +11 -0
  16. data/lib/scribble/nodes/call.rb +55 -0
  17. data/lib/scribble/nodes/ending.rb +6 -0
  18. data/lib/scribble/nodes/node.rb +24 -0
  19. data/lib/scribble/nodes/value.rb +16 -0
  20. data/lib/scribble/objects/boolean.rb +33 -0
  21. data/lib/scribble/objects/fixnum.rb +53 -0
  22. data/lib/scribble/objects/nil.rb +21 -0
  23. data/lib/scribble/objects/string.rb +62 -0
  24. data/lib/scribble/parsing/nester.rb +49 -0
  25. data/lib/scribble/parsing/parser.rb +132 -0
  26. data/lib/scribble/parsing/reporter.rb +71 -0
  27. data/lib/scribble/parsing/transform.rb +87 -0
  28. data/lib/scribble/partial.rb +41 -0
  29. data/lib/scribble/registry.rb +95 -0
  30. data/lib/scribble/support/context.rb +98 -0
  31. data/lib/scribble/support/matcher.rb +74 -0
  32. data/lib/scribble/support/unmatched.rb +70 -0
  33. data/lib/scribble/support/utilities.rb +49 -0
  34. data/lib/scribble/template.rb +61 -0
  35. data/lib/scribble/version.rb +3 -0
  36. data/scribble.gemspec +22 -0
  37. data/test/all.rb +23 -0
  38. data/test/errors_test.rb +94 -0
  39. data/test/methods/if_test.rb +49 -0
  40. data/test/methods/layout_test.rb +71 -0
  41. data/test/methods/partial_test.rb +85 -0
  42. data/test/methods/times_test.rb +10 -0
  43. data/test/objects/boolean_test.rb +162 -0
  44. data/test/objects/fixnum_test.rb +236 -0
  45. data/test/objects/nil_test.rb +83 -0
  46. data/test/objects/string_test.rb +268 -0
  47. data/test/parsing/parsing_test.rb +234 -0
  48. data/test/registry_test.rb +264 -0
  49. data/test/template_test.rb +51 -0
  50. data/test/test_helper.rb +65 -0
  51. metadata +127 -0
@@ -0,0 +1,236 @@
1
+ require_relative '../test_helper'
2
+
3
+ describe 'scribble fixnum' do
4
+ it 'can be used as a literal' do
5
+ assert_scribble_render '{{ 3 }}', '3'
6
+ assert_scribble_render '{{ 322 }}', '322'
7
+ assert_scribble_render '{{ 3243232 }}', '3243232'
8
+ end
9
+
10
+ it 'knows if is odd' do
11
+ assert_scribble_render '{{ 3.odd }}', 'true'
12
+ assert_scribble_render '{{ 4.odd }}', 'false'
13
+ end
14
+
15
+ it 'knows if is even' do
16
+ assert_scribble_render '{{ 3.even }}', 'false'
17
+ assert_scribble_render '{{ 4.even }}', 'true'
18
+ end
19
+
20
+ it 'knows if is zero' do
21
+ assert_scribble_render '{{ -5.zero }}', 'false'
22
+ assert_scribble_render '{{ 0.zero }}', 'true'
23
+ assert_scribble_render '{{ 5.zero }}', 'false'
24
+ end
25
+
26
+ it 'knows if is nonzero' do
27
+ assert_scribble_render '{{ -5.nonzero }}', 'true'
28
+ assert_scribble_render '{{ 0.nonzero}}', 'false'
29
+ assert_scribble_render '{{ 5.nonzero}}', 'true'
30
+ end
31
+
32
+ it 'supports method and operator for logical or' do
33
+ assert_scribble_render '{{ 0.or true }}', 'true'
34
+ assert_scribble_render '{{ 3.or true }}', 'true'
35
+ assert_scribble_render '{{ 0.or false }}', 'false'
36
+ assert_scribble_render '{{ 3.or false }}', 'true'
37
+ assert_scribble_render '{{ 0.or 2 }}', 'true'
38
+ assert_scribble_render '{{ 3.or 2 }}', 'true'
39
+ assert_scribble_render '{{ 0.or 0 }}', 'false'
40
+ assert_scribble_render '{{ 3.or 0 }}', 'true'
41
+ assert_scribble_render "{{ 0.or 'foo' }}", 'true'
42
+ assert_scribble_render "{{ 3.or 'foo' }}", 'true'
43
+ assert_scribble_render "{{ 0.or '' }}", 'false'
44
+ assert_scribble_render "{{ 3.or '' }}", 'true'
45
+ assert_scribble_render '{{ 0 | true }}', 'true'
46
+ assert_scribble_render '{{ 3 | true }}', 'true'
47
+ assert_scribble_render '{{ 0 | false }}', 'false'
48
+ assert_scribble_render '{{ 3 | false }}', 'true'
49
+ assert_scribble_render '{{ 0 | 2 }}', 'true'
50
+ assert_scribble_render '{{ 3 | 2 }}', 'true'
51
+ assert_scribble_render '{{ 0 | 0 }}', 'false'
52
+ assert_scribble_render '{{ 3 | 0 }}', 'true'
53
+ assert_scribble_render "{{ 0 | 'foo' }}", 'true'
54
+ assert_scribble_render "{{ 3 | 'foo' }}", 'true'
55
+ assert_scribble_render "{{ 0 | '' }}", 'false'
56
+ assert_scribble_render "{{ 3 | '' }}", 'true'
57
+ end
58
+
59
+ it 'supports method and operator for logical and' do
60
+ assert_scribble_render '{{ 0.and true }}', 'false'
61
+ assert_scribble_render '{{ 3.and true }}', 'true'
62
+ assert_scribble_render '{{ 0.and false }}', 'false'
63
+ assert_scribble_render '{{ 3.and false }}', 'false'
64
+ assert_scribble_render '{{ 0.and 2 }}', 'false'
65
+ assert_scribble_render '{{ 3.and 2 }}', 'true'
66
+ assert_scribble_render '{{ 0.and 0 }}', 'false'
67
+ assert_scribble_render '{{ 3.and 0 }}', 'false'
68
+ assert_scribble_render "{{ 0.and 'foo' }}", 'false'
69
+ assert_scribble_render "{{ 3.and 'foo' }}", 'true'
70
+ assert_scribble_render "{{ 0.and '' }}", 'false'
71
+ assert_scribble_render "{{ 3.and '' }}", 'false'
72
+ assert_scribble_render '{{ 0 & true }}', 'false'
73
+ assert_scribble_render '{{ 3 & true }}', 'true'
74
+ assert_scribble_render '{{ 0 & false }}', 'false'
75
+ assert_scribble_render '{{ 3 & false }}', 'false'
76
+ assert_scribble_render '{{ 0 & 2 }}', 'false'
77
+ assert_scribble_render '{{ 3 & 2 }}', 'true'
78
+ assert_scribble_render '{{ 0 & 0 }}', 'false'
79
+ assert_scribble_render '{{ 3 & 0 }}', 'false'
80
+ assert_scribble_render "{{ 0 & 'foo' }}", 'false'
81
+ assert_scribble_render "{{ 3 & 'foo' }}", 'true'
82
+ assert_scribble_render "{{ 0 & '' }}", 'false'
83
+ assert_scribble_render "{{ 3 & '' }}", 'false'
84
+ end
85
+
86
+ it 'can equal another integer' do
87
+ assert_scribble_render '{{ 3.equals 3 }}', 'true'
88
+ assert_scribble_render '{{ 3.equals 4 }}', 'false'
89
+ assert_scribble_render '{{ 3 = 3 }}', 'true'
90
+ assert_scribble_render '{{ 3 = 4 }}', 'false'
91
+ end
92
+
93
+ it 'does not equal another type' do
94
+ assert_scribble_render "{{ 3.equals 'foo' }}", 'false'
95
+ assert_scribble_render '{{ 3.equals true }}', 'false'
96
+ assert_scribble_render "{{ 3 = 'foo' }}", 'false'
97
+ assert_scribble_render '{{ 3 = true }}', 'false'
98
+ end
99
+
100
+ it 'can differ from another integer' do
101
+ assert_scribble_render '{{ 3.differs 3 }}', 'false'
102
+ assert_scribble_render '{{ 3.differs 4 }}', 'true'
103
+ assert_scribble_render '{{ 3 != 3 }}', 'false'
104
+ assert_scribble_render '{{ 3 != 4 }}', 'true'
105
+ end
106
+
107
+ it 'differs from another type' do
108
+ assert_scribble_render "{{ 3.differs 'foo' }}", 'true'
109
+ assert_scribble_render '{{ 3.differs true }}', 'true'
110
+ assert_scribble_render "{{ 3 != 'foo' }}", 'true'
111
+ assert_scribble_render '{{ 3 != true }}', 'true'
112
+ end
113
+
114
+ it 'can be compared to another integer' do
115
+ assert_scribble_render '{{ 2.greater 1 }}', 'true'
116
+ assert_scribble_render '{{ 2.greater 2 }}', 'false'
117
+ assert_scribble_render '{{ 2.greater 3 }}', 'false'
118
+ assert_scribble_render '{{ 2 > 1 }}', 'true'
119
+ assert_scribble_render '{{ 2 > 2 }}', 'false'
120
+ assert_scribble_render '{{ 2 > 3 }}', 'false'
121
+ assert_scribble_render '{{ 2.less 1 }}', 'false'
122
+ assert_scribble_render '{{ 2.less 2 }}', 'false'
123
+ assert_scribble_render '{{ 2.less 3 }}', 'true'
124
+ assert_scribble_render '{{ 2 < 1 }}', 'false'
125
+ assert_scribble_render '{{ 2 < 2 }}', 'false'
126
+ assert_scribble_render '{{ 2 < 3 }}', 'true'
127
+ assert_scribble_render '{{ 2.greater_or_equal 1 }}', 'true'
128
+ assert_scribble_render '{{ 2.greater_or_equal 2 }}', 'true'
129
+ assert_scribble_render '{{ 2.greater_or_equal 3 }}', 'false'
130
+ assert_scribble_render '{{ 2 >= 1 }}', 'true'
131
+ assert_scribble_render '{{ 2 >= 2 }}', 'true'
132
+ assert_scribble_render '{{ 2 >= 3 }}', 'false'
133
+ assert_scribble_render '{{ 2.less_or_equal 1 }}', 'false'
134
+ assert_scribble_render '{{ 2.less_or_equal 2 }}', 'true'
135
+ assert_scribble_render '{{ 2.less_or_equal 3 }}', 'true'
136
+ assert_scribble_render '{{ 2 <= 1 }}', 'false'
137
+ assert_scribble_render '{{ 2 <= 2 }}', 'true'
138
+ assert_scribble_render '{{ 2 <= 3 }}', 'true'
139
+ end
140
+
141
+ it 'can not be compared to another type' do
142
+ assert_scribble_raises "{{ 2.greater 'foo' }}", Scribble::Errors::Argument
143
+ assert_scribble_raises '{{ 2.greater true }}', Scribble::Errors::Argument
144
+ assert_scribble_raises "{{ 2 > 'foo' }}", Scribble::Errors::Argument
145
+ assert_scribble_raises '{{ 2 > true }}', Scribble::Errors::Argument
146
+ assert_scribble_raises "{{ 2.less 'foo' }}", Scribble::Errors::Argument
147
+ assert_scribble_raises '{{ 2.less true }}', Scribble::Errors::Argument
148
+ assert_scribble_raises "{{ 2 < 'foo' }}", Scribble::Errors::Argument
149
+ assert_scribble_raises '{{ 2 < true }}', Scribble::Errors::Argument
150
+ assert_scribble_raises "{{ 2.greater_or_equal 'foo' }}", Scribble::Errors::Argument
151
+ assert_scribble_raises '{{ 2.greater_or_equal true }}', Scribble::Errors::Argument
152
+ assert_scribble_raises "{{ 2 >= 'foo' }}", Scribble::Errors::Argument
153
+ assert_scribble_raises '{{ 2 >= true }}', Scribble::Errors::Argument
154
+ assert_scribble_raises "{{ 2.less_or_equal 'foo' }}", Scribble::Errors::Argument
155
+ assert_scribble_raises '{{ 2.less_or_equal true }}', Scribble::Errors::Argument
156
+ assert_scribble_raises "{{ 2 <= 'foo' }}", Scribble::Errors::Argument
157
+ assert_scribble_raises '{{ 2 <= true }}', Scribble::Errors::Argument
158
+ end
159
+
160
+ it 'can have integers and strings added to it but not booleans' do
161
+ assert_scribble_render '{{ 3.add 2 }}', '5'
162
+ assert_scribble_render '{{ 3.add(-2) }}', '1'
163
+ assert_scribble_render "{{ 3.add 'foo' }}", '3foo'
164
+ assert_scribble_raises '{{ 3.add true }}', Scribble::Errors::Argument
165
+ assert_scribble_render '{{ 3 + 2 }}', '5'
166
+ assert_scribble_render '{{ 3 + -2 }}', '1'
167
+ assert_scribble_render "{{ 3 + 'foo' }}", '3foo'
168
+ assert_scribble_raises '{{ 3 + true }}', Scribble::Errors::Argument
169
+ end
170
+
171
+ it 'can only have integers subtracted from it' do
172
+ assert_scribble_render '{{ 3.subtract 2 }}', '1'
173
+ assert_scribble_render '{{ 3.subtract(-2) }}', '5'
174
+ assert_scribble_raises "{{ 3.subtract 'foo' }}", Scribble::Errors::Argument
175
+ assert_scribble_raises '{{ 3.subtract true }}', Scribble::Errors::Argument
176
+ assert_scribble_render '{{ 3 - 2 }}', '1'
177
+ assert_scribble_render '{{ 3 - -2 }}', '5'
178
+ assert_scribble_raises "{{ 3 - 'foo' }}", Scribble::Errors::Argument
179
+ assert_scribble_raises '{{ 3 - true }}', Scribble::Errors::Argument
180
+ end
181
+
182
+ it 'can be multiplied by integers and strings but not booleans' do
183
+ assert_scribble_render '{{ 3.multiply 2 }}', '6'
184
+ assert_scribble_render '{{ 3.multiply(-2) }}', '-6'
185
+ assert_scribble_render "{{ 3.multiply 'foo' }}", 'foofoofoo'
186
+ assert_scribble_raises "{{ -3.multiply 'foo' }}", Scribble::Errors::Argument
187
+ assert_scribble_raises '{{ 3.multiply true }}', Scribble::Errors::Argument
188
+ assert_scribble_render '{{ 3 * 2 }}', '6'
189
+ assert_scribble_render '{{ 3 * -2 }}', '-6'
190
+ assert_scribble_render "{{ 3 * 'foo' }}", 'foofoofoo'
191
+ assert_scribble_raises "{{ -3 * 'foo' }}", Scribble::Errors::Argument
192
+ assert_scribble_raises '{{ 3 * true }}', Scribble::Errors::Argument
193
+ end
194
+
195
+ it 'can only be divided by integers' do
196
+ assert_scribble_render '{{ 10.divide 2 }}', '5'
197
+ assert_scribble_render '{{ 10.divide(-2) }}', '-5'
198
+ assert_scribble_raises "{{ 10.divide 'foo' }}", Scribble::Errors::Argument
199
+ assert_scribble_raises '{{ 10.divide true }}', Scribble::Errors::Argument
200
+ assert_scribble_render '{{ 10 / 2 }}', '5'
201
+ assert_scribble_render '{{ 10 / -2 }}', '-5'
202
+ assert_scribble_raises "{{ 10 / 'foo' }}", Scribble::Errors::Argument
203
+ assert_scribble_raises '{{ 10 / true }}', Scribble::Errors::Argument
204
+ end
205
+
206
+ it 'can only have its remainder taken by integers' do
207
+ assert_scribble_render '{{ 10.remainder 3 }}', '1'
208
+ assert_scribble_render '{{ 10.remainder(-3) }}', '-2'
209
+ assert_scribble_raises "{{ 10.remainder 'foo' }}", Scribble::Errors::Argument
210
+ assert_scribble_raises '{{ 10.remainder true }}', Scribble::Errors::Argument
211
+ assert_scribble_render '{{ 10 % 3 }}', '1'
212
+ assert_scribble_render '{{ 10 % -3 }}', '-2'
213
+ assert_scribble_raises "{{ 10 % 'foo' }}", Scribble::Errors::Argument
214
+ assert_scribble_raises '{{ 10 % true }}', Scribble::Errors::Argument
215
+ end
216
+
217
+ it 'can be negated' do
218
+ assert_scribble_render "{{ 3.negative }}", '-3'
219
+ assert_scribble_render "{{ -3 }}", '-3'
220
+ end
221
+
222
+ it 'can be logically negated' do
223
+ assert_scribble_render '{{ 3.not }}', 'false'
224
+ assert_scribble_render '{{ -3.not }}', 'false'
225
+ assert_scribble_render '{{ 0.not }}', 'true'
226
+ assert_scribble_render '{{ !3 }}', 'false'
227
+ assert_scribble_render '{{ !-3 }}', 'false'
228
+ assert_scribble_render '{{ !0 }}', 'true'
229
+ end
230
+
231
+ it 'returns an absolute value' do
232
+ assert_scribble_render '{{ 3.abs }}', '3'
233
+ assert_scribble_render '{{ -3.abs }}', '3'
234
+ assert_scribble_render '{{ 0.abs }}', '0'
235
+ end
236
+ end
@@ -0,0 +1,83 @@
1
+ require_relative '../test_helper'
2
+
3
+ describe 'scribble nil' do
4
+ def with_nil
5
+ Scribble::Registry.reset do
6
+ Scribble::Registry.for Scribble::Template::Context do
7
+ method :nil, to: -> { nil }
8
+ end
9
+
10
+ yield
11
+ end
12
+ end
13
+
14
+ it 'supports method and operator for logical or' do
15
+ with_nil do
16
+ assert_scribble_render '{{ nil.or true }}', 'true'
17
+ assert_scribble_render '{{ nil.or false }}', 'false'
18
+ assert_scribble_render '{{ nil.or 2 }}', 'true'
19
+ assert_scribble_render '{{ nil.or 0 }}', 'false'
20
+ assert_scribble_render "{{ nil.or 'foo' }}", 'true'
21
+ assert_scribble_render "{{ nil.or '' }}", 'false'
22
+ assert_scribble_render '{{ nil | true }}', 'true'
23
+ assert_scribble_render '{{ nil | false }}', 'false'
24
+ assert_scribble_render '{{ nil | 2 }}', 'true'
25
+ assert_scribble_render '{{ nil | 0 }}', 'false'
26
+ assert_scribble_render "{{ nil | 'foo' }}", 'true'
27
+ assert_scribble_render "{{ nil | '' }}", 'false'
28
+ end
29
+ end
30
+
31
+ it 'supports method and operator for logical and' do
32
+ with_nil do
33
+ assert_scribble_render '{{ nil.and true }}', 'false'
34
+ assert_scribble_render '{{ nil.and false }}', 'false'
35
+ assert_scribble_render '{{ nil.and 2 }}', 'false'
36
+ assert_scribble_render '{{ nil.and 0 }}', 'false'
37
+ assert_scribble_render "{{ nil.and 'foo' }}", 'false'
38
+ assert_scribble_render "{{ nil.and '' }}", 'false'
39
+ assert_scribble_render '{{ nil & true }}', 'false'
40
+ assert_scribble_render '{{ nil & false }}', 'false'
41
+ assert_scribble_render '{{ nil & 2 }}', 'false'
42
+ assert_scribble_render '{{ nil & 0 }}', 'false'
43
+ assert_scribble_render "{{ nil & 'foo' }}", 'false'
44
+ assert_scribble_render "{{ nil & '' }}", 'false'
45
+ end
46
+ end
47
+
48
+ it 'equals only nil' do
49
+ with_nil do
50
+ assert_scribble_render '{{ nil.equals nil }}', 'true'
51
+ assert_scribble_render "{{ nil.equals 'bar' }}", 'false'
52
+ assert_scribble_render '{{ nil.equals 1 }}', 'false'
53
+ assert_scribble_render '{{ nil.equals true }}', 'false'
54
+ assert_scribble_render '{{ nil.equals false }}', 'false'
55
+ assert_scribble_render '{{ nil = nil }}', 'true'
56
+ assert_scribble_render "{{ nil = 'bar' }}", 'false'
57
+ assert_scribble_render '{{ nil = 1 }}', 'false'
58
+ assert_scribble_render '{{ nil = true }}', 'false'
59
+ assert_scribble_render '{{ nil = false }}', 'false'
60
+ end
61
+ end
62
+
63
+ it 'differs everything but nil' do
64
+ with_nil do
65
+ assert_scribble_render '{{ nil.differs nil }}', 'false'
66
+ assert_scribble_render "{{ nil.differs 'bar' }}", 'true'
67
+ assert_scribble_render '{{ nil.differs 1 }}', 'true'
68
+ assert_scribble_render '{{ nil.differs true }}', 'true'
69
+ assert_scribble_render '{{ nil.differs false }}', 'true'
70
+ assert_scribble_render '{{ nil != nil }}', 'false'
71
+ assert_scribble_render "{{ nil != 'bar' }}", 'true'
72
+ assert_scribble_render '{{ nil != 1 }}', 'true'
73
+ assert_scribble_render '{{ nil != true }}', 'true'
74
+ assert_scribble_render '{{ nil != false }}', 'true'
75
+ end
76
+ end
77
+
78
+ it 'renders as an empty string' do
79
+ with_nil do
80
+ assert_scribble_render '{{ nil }}', ''
81
+ end
82
+ end
83
+ end
@@ -0,0 +1,268 @@
1
+ require_relative '../test_helper'
2
+
3
+ describe 'scribble string' do
4
+ it 'can be used as a literal' do
5
+ assert_scribble_render "{{ 'Foo bar baz' }}", 'Foo bar baz'
6
+ assert_scribble_render "{{ '%${^$%T#%##' }}", '%${^$%T#%##'
7
+ end
8
+
9
+ it 'supports escape characters' do
10
+ assert_scribble_render "{{ 'Foo \\' bar \\\\ \\a' }}", "Foo ' bar \\ a"
11
+ end
12
+
13
+ it 'can be capitalized' do
14
+ assert_scribble_render "{{ 'foo'.capitalize }}", 'Foo'
15
+ assert_scribble_render "{{ 'BAR'.capitalize }}", 'Bar'
16
+ assert_scribble_render "{{ 'Baz'.capitalize }}", 'Baz'
17
+ end
18
+
19
+ it 'can be upcased' do
20
+ assert_scribble_render "{{ 'foo'.upcase }}", 'FOO'
21
+ assert_scribble_render "{{ 'BAR'.upcase }}", 'BAR'
22
+ assert_scribble_render "{{ 'Baz'.upcase }}", 'BAZ'
23
+ end
24
+
25
+ it 'can be downcased' do
26
+ assert_scribble_render "{{ 'foo'.downcase }}", 'foo'
27
+ assert_scribble_render "{{ 'BAR'.downcase }}", 'bar'
28
+ assert_scribble_render "{{ 'Baz'.downcase }}", 'baz'
29
+ end
30
+
31
+ it 'can be reversed' do
32
+ assert_scribble_render "{{ 'foo'.reverse }}", 'oof'
33
+ assert_scribble_render "{{ 'bar'.reverse }}", 'rab'
34
+ assert_scribble_render "{{ 'baz'.reverse }}", 'zab'
35
+ end
36
+
37
+ it 'returns its size, length and wether it is empty' do
38
+ assert_scribble_render "{{ 'foo'.size }}", '3'
39
+ assert_scribble_render "{{ 'foo bar baz'.size }}", '11'
40
+ assert_scribble_render "{{ 'foo'.length }}", '3'
41
+ assert_scribble_render "{{ 'foo bar baz'.length }}", '11'
42
+ assert_scribble_render "{{ 'foo'.empty }}", 'false'
43
+ assert_scribble_render "{{ ''.empty }}", 'true'
44
+ end
45
+
46
+ it 'supports a replace method' do
47
+ assert_scribble_render "{{ 'foo'.replace('f', 'b').replace 'oo', 'ar' }}", 'bar'
48
+ assert_scribble_render "{{ 'foo bar bar baz'.replace 'bar', 'foo' }}", 'foo foo foo baz'
49
+ end
50
+
51
+ it 'supports a remove method' do
52
+ assert_scribble_render "{{ 'foo'.remove('f').remove 'oo' }}", ''
53
+ assert_scribble_render "{{ 'foo bar bar baz'.remove 'bar' }}", 'foo baz'
54
+ end
55
+
56
+ it 'supports a replace_first method' do
57
+ assert_scribble_render "{{ 'foo'.replace('f', 'b').replace_first 'oo', 'ar' }}", 'bar'
58
+ assert_scribble_render "{{ 'foo bar bar baz'.replace_first 'bar', 'foo' }}", 'foo foo bar baz'
59
+ end
60
+
61
+ it 'supports a remove_first method' do
62
+ assert_scribble_render "{{ 'foo'.remove('f').remove_first 'oo' }}", ''
63
+ assert_scribble_render "{{ 'foo bar bar baz'.remove_first 'bar' }}", 'foo bar baz'
64
+ end
65
+
66
+ it 'supports a append method' do
67
+ assert_scribble_render "{{ 'foo'.append(' bar').append ' baz' }}", 'foo bar baz'
68
+ end
69
+
70
+ it 'supports a prepend method' do
71
+ assert_scribble_render "{{ 'foo'.prepend(' bar').prepend ' baz' }}", ' baz barfoo'
72
+ end
73
+
74
+ it 'supports a truncate method' do
75
+ assert_scribble_render "{{ ' foo bar baz'.truncate 8 }}", ' foo bar ...'
76
+ assert_scribble_render "{{ ' foo bar baz'.truncate 8, 'aaa' }}", ' foo baraaa'
77
+ assert_scribble_render "{{ ' foo bar baz'.truncate 12 }}", ' foo bar baz'
78
+ end
79
+
80
+ it 'supports a truncate words method' do
81
+ assert_scribble_render "{{ ' foo bar baz'.truncate_words 2 }}", ' foo bar ...'
82
+ assert_scribble_render "{{ ' foo bar baz'.truncate_words 2, 'aaa' }}", ' foo baraaa'
83
+ assert_scribble_render "{{ ' foo bar baz'.truncate_words 3 }}", ' foo bar baz'
84
+ end
85
+
86
+ it 'supports strip methods' do
87
+ assert_scribble_render "{{ ' foo bar '.strip }}", 'foo bar'
88
+ assert_scribble_render "{{ ' foo bar '.strip_left }}", 'foo bar '
89
+ assert_scribble_render "{{ ' foo bar '.strip_right }}", ' foo bar'
90
+ end
91
+
92
+ it 'supports a repeat method' do
93
+ assert_scribble_render "{{ 'foo'.repeat 3 }}", 'foofoofoo'
94
+ assert_scribble_render "{{ 'foo'.repeat(3).repeat 2 }}", 'foofoofoofoofoofoo'
95
+ end
96
+
97
+ it 'supports method and operator for logical or' do
98
+ assert_scribble_render "{{ ''.or true }}", 'true'
99
+ assert_scribble_render "{{ 'foo'.or true }}", 'true'
100
+ assert_scribble_render "{{ ''.or false }}", 'false'
101
+ assert_scribble_render "{{ 'foo'.or false }}", 'true'
102
+ assert_scribble_render "{{ ''.or 2 }}", 'true'
103
+ assert_scribble_render "{{ 'foo'.or 2 }}", 'true'
104
+ assert_scribble_render "{{ ''.or 0 }}", 'false'
105
+ assert_scribble_render "{{ 'foo'.or 0 }}", 'true'
106
+ assert_scribble_render "{{ ''.or 'foo' }}", 'true'
107
+ assert_scribble_render "{{ 'foo'.or 'foo' }}", 'true'
108
+ assert_scribble_render "{{ ''.or '' }}", 'false'
109
+ assert_scribble_render "{{ 'foo'.or '' }}", 'true'
110
+ assert_scribble_render "{{ '' | true }}", 'true'
111
+ assert_scribble_render "{{ 'foo' | true }}", 'true'
112
+ assert_scribble_render "{{ '' | false }}", 'false'
113
+ assert_scribble_render "{{ 'foo' | false }}", 'true'
114
+ assert_scribble_render "{{ '' | 2 }}", 'true'
115
+ assert_scribble_render "{{ 'foo' | 2 }}", 'true'
116
+ assert_scribble_render "{{ '' | 0 }}", 'false'
117
+ assert_scribble_render "{{ 'foo' | 0 }}", 'true'
118
+ assert_scribble_render "{{ '' | 'foo' }}", 'true'
119
+ assert_scribble_render "{{ 'foo' | 'foo' }}", 'true'
120
+ assert_scribble_render "{{ '' | '' }}", 'false'
121
+ assert_scribble_render "{{ 'foo' | '' }}", 'true'
122
+ end
123
+
124
+ it 'supports method and operator for logical and' do
125
+ assert_scribble_render "{{ ''.and true }}", 'false'
126
+ assert_scribble_render "{{ 'foo'.and true }}", 'true'
127
+ assert_scribble_render "{{ ''.and false }}", 'false'
128
+ assert_scribble_render "{{ 'foo'.and false }}", 'false'
129
+ assert_scribble_render "{{ ''.and 2 }}", 'false'
130
+ assert_scribble_render "{{ 'foo'.and 2 }}", 'true'
131
+ assert_scribble_render "{{ ''.and 0 }}", 'false'
132
+ assert_scribble_render "{{ 'foo'.and 0 }}", 'false'
133
+ assert_scribble_render "{{ ''.and 'foo' }}", 'false'
134
+ assert_scribble_render "{{ 'foo'.and 'foo' }}", 'true'
135
+ assert_scribble_render "{{ ''.and '' }}", 'false'
136
+ assert_scribble_render "{{ 'foo'.and '' }}", 'false'
137
+ assert_scribble_render "{{ '' & true }}", 'false'
138
+ assert_scribble_render "{{ 'foo' & true }}", 'true'
139
+ assert_scribble_render "{{ '' & false }}", 'false'
140
+ assert_scribble_render "{{ 'foo' & false }}", 'false'
141
+ assert_scribble_render "{{ '' & 2 }}", 'false'
142
+ assert_scribble_render "{{ 'foo' & 2 }}", 'true'
143
+ assert_scribble_render "{{ '' & 0 }}", 'false'
144
+ assert_scribble_render "{{ 'foo' & 0 }}", 'false'
145
+ assert_scribble_render "{{ '' & 'foo' }}", 'false'
146
+ assert_scribble_render "{{ 'foo' & 'foo' }}", 'true'
147
+ assert_scribble_render "{{ '' & '' }}", 'false'
148
+ assert_scribble_render "{{ 'foo' & '' }}", 'false'
149
+ end
150
+
151
+ it 'can equal another string' do
152
+ assert_scribble_render "{{ 'foo'.equals 'foo' }}", 'true'
153
+ assert_scribble_render "{{ 'foo'.equals 'bar' }}", 'false'
154
+ assert_scribble_render "{{ 'foo' = 'foo' }}", 'true'
155
+ assert_scribble_render "{{ 'foo' = 'bar' }}", 'false'
156
+ end
157
+
158
+ it 'does not equal another type' do
159
+ assert_scribble_render "{{ 'foo'.equals 3 }}", 'false'
160
+ assert_scribble_render "{{ 'foo'.equals true }}", 'false'
161
+ assert_scribble_render "{{ 'foo' = 3 }}", 'false'
162
+ assert_scribble_render "{{ 'foo' = true }}", 'false'
163
+ end
164
+
165
+ it 'can differ from another integer' do
166
+ assert_scribble_render "{{ 'foo'.differs 'foo' }}", 'false'
167
+ assert_scribble_render "{{ 'foo'.differs 'bar' }}", 'true'
168
+ assert_scribble_render "{{ 'foo' != 'foo' }}", 'false'
169
+ assert_scribble_render "{{ 'foo' != 'bar' }}", 'true'
170
+ end
171
+
172
+ it 'differs from another type' do
173
+ assert_scribble_render "{{ 'foo'.differs 3 }}", 'true'
174
+ assert_scribble_render "{{ 'foo'.differs true }}", 'true'
175
+ assert_scribble_render "{{ 'foo' != 3 }}", 'true'
176
+ assert_scribble_render "{{ 'foo' != true }}", 'true'
177
+ end
178
+
179
+ it 'can not be compared' do
180
+ assert_scribble_raises "{{ 'foo'.greater 'foo' }}"
181
+ assert_scribble_raises "{{ 'foo'.greater 3 }}"
182
+ assert_scribble_raises "{{ 'foo'.greater true }}"
183
+ assert_scribble_raises "{{ 'foo' > 'foo' }}"
184
+ assert_scribble_raises "{{ 'foo' > 3 }}"
185
+ assert_scribble_raises "{{ 'foo' > true }}"
186
+ assert_scribble_raises "{{ 'foo'.less 'foo' }}"
187
+ assert_scribble_raises "{{ 'foo'.less 3 }}"
188
+ assert_scribble_raises "{{ 'foo'.less true }}"
189
+ assert_scribble_raises "{{ 'foo' < 'foo' }}"
190
+ assert_scribble_raises "{{ 'foo' < 3 }}"
191
+ assert_scribble_raises "{{ 'foo' < true }}"
192
+ assert_scribble_raises "{{ 'foo'.greater_or_equal 'foo' }}"
193
+ assert_scribble_raises "{{ 'foo'.greater_or_equal 3 }}"
194
+ assert_scribble_raises "{{ 'foo'.greater_or_equal true }}"
195
+ assert_scribble_raises "{{ 'foo' >= 'foo' }}"
196
+ assert_scribble_raises "{{ 'foo' >= 3 }}"
197
+ assert_scribble_raises "{{ 'foo' >= true }}"
198
+ assert_scribble_raises "{{ 'foo'.less_or_equal 'foo' }}"
199
+ assert_scribble_raises "{{ 'foo'.less_or_equal 3 }}"
200
+ assert_scribble_raises "{{ 'foo'.less_or_equal true }}"
201
+ assert_scribble_raises "{{ 'foo' <= 'foo' }}"
202
+ assert_scribble_raises "{{ 'foo' <= 3 }}"
203
+ assert_scribble_raises "{{ 'foo' <= true }}"
204
+ end
205
+
206
+ it 'can have integers and strings added to it but not booleans' do
207
+ assert_scribble_render "{{ 'foo'.add 2 }}", 'foo2'
208
+ assert_scribble_render "{{ 'foo'.add 'bar' }}", 'foobar'
209
+ assert_scribble_raises "{{ 'foo'.add true }}", Scribble::Errors::Argument
210
+ assert_scribble_render "{{ 'foo' + 2 }}", 'foo2'
211
+ assert_scribble_render "{{ 'foo' + 'bar' }}", 'foobar'
212
+ assert_scribble_raises "{{ 'foo' + true }}", Scribble::Errors::Argument
213
+ end
214
+
215
+ it 'can only have string subtracted from it' do
216
+ assert_scribble_render "{{ 'foobarbaz foo'.subtract 'foo' }}", 'barbaz '
217
+ assert_scribble_render "{{ 'foobarbaz foo'.subtract 'bar' }}", 'foobaz foo'
218
+ assert_scribble_raises "{{ 'foobarbaz foo'.subtract 2 }}", Scribble::Errors::Argument
219
+ assert_scribble_raises "{{ 'foobarbaz foo'.subtract true }}", Scribble::Errors::Argument
220
+ assert_scribble_render "{{ 'foobarbaz foo' - 'foo' }}", 'barbaz '
221
+ assert_scribble_render "{{ 'foobarbaz foo' - 'bar' }}", 'foobaz foo'
222
+ assert_scribble_raises "{{ 'foobarbaz foo' - 2 }}", Scribble::Errors::Argument
223
+ assert_scribble_raises "{{ 'foobarbaz foo' - true }}", Scribble::Errors::Argument
224
+ end
225
+
226
+ it 'can only be multiplied by positive integers' do
227
+ assert_scribble_render "{{ 'foo'.multiply 2 }}", 'foofoo'
228
+ assert_scribble_render "{{ 'foo'.multiply 5 }}", 'foofoofoofoofoo'
229
+ assert_scribble_raises "{{ 'foo'.multiply 'foo' }}", Scribble::Errors::Argument
230
+ assert_scribble_raises "{{ 'foo'.multiply true }}", Scribble::Errors::Argument
231
+ assert_scribble_raises "{{ 'foo'.multiply(-2) }}", Scribble::Errors::Argument
232
+ assert_scribble_render "{{ 'foo' * 2 }}", 'foofoo'
233
+ assert_scribble_render "{{ 'foo' * 5 }}", 'foofoofoofoofoo'
234
+ assert_scribble_raises "{{ 'foo' * 'foo' }}", Scribble::Errors::Argument
235
+ assert_scribble_raises "{{ 'foo' * true }}", Scribble::Errors::Argument
236
+ assert_scribble_raises "{{ 'foo' * -2 }}", Scribble::Errors::Argument
237
+ end
238
+
239
+ it 'can not be divided' do
240
+ assert_scribble_raises "{{ 'foo'.divide 5 }}"
241
+ assert_scribble_raises "{{ 'foo'.divide 'foo' }}"
242
+ assert_scribble_raises "{{ 'foo'.divide true }}"
243
+ assert_scribble_raises "{{ 'foo' / 5 }}"
244
+ assert_scribble_raises "{{ 'foo' / 'foo' }}"
245
+ assert_scribble_raises "{{ 'foo' / true }}"
246
+ end
247
+
248
+ it 'can not be have its remainder taken' do
249
+ assert_scribble_raises "{{ 'foo'.remainder 5 }}"
250
+ assert_scribble_raises "{{ 'foo'.remainder 'foo' }}"
251
+ assert_scribble_raises "{{ 'foo'.remainder true }}"
252
+ assert_scribble_raises "{{ 'foo' % 5 }}"
253
+ assert_scribble_raises "{{ 'foo' % 'foo' }}"
254
+ assert_scribble_raises "{{ 'foo' % true }}"
255
+ end
256
+
257
+ it 'can not be negated' do
258
+ assert_scribble_raises "{{ 'foo'.negative }}"
259
+ assert_scribble_raises "{{ -'foo' }}"
260
+ end
261
+
262
+ it 'can be logically negated' do
263
+ assert_scribble_render "{{ 'foo'.not }}", 'false'
264
+ assert_scribble_render "{{ ''.not }}", 'true'
265
+ assert_scribble_render "{{ !'foo' }}", 'false'
266
+ assert_scribble_render "{{ !'' }}", 'true'
267
+ end
268
+ end