scribble 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
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