PageTemplate 1.2.0 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Changes +24 -0
- data/MANIFEST +0 -1
- data/README.txt +10 -8
- data/Rakefile +30 -9
- data/lib/PageTemplate/case.rb +72 -0
- data/lib/PageTemplate/commands.rb +500 -0
- data/lib/PageTemplate/parser.rb +373 -0
- data/lib/PageTemplate.rb +47 -991
- data/setup-usage.txt +129 -0
- data/setup.rb +1360 -0
- data/tdata/dummy.txt +2 -0
- data/test.rb +616 -0
- metadata +13 -169
- data/CVS/Entries +0 -10
- data/CVS/Repository +0 -1
- data/CVS/Root +0 -1
- data/Changes~ +0 -7
- data/InstalledFiles +0 -7
- data/Rakefile~ +0 -54
- data/TC_PageTemplate.rb +0 -974
- data/TC_PageTemplate.rb~ +0 -965
- data/config.save +0 -12
- data/doc/classes/BlockCommand.html +0 -229
- data/doc/classes/BlockCommand.src/M000004.html +0 -18
- data/doc/classes/BlockCommand.src/M000005.html +0 -25
- data/doc/classes/BlockCommand.src/M000006.html +0 -18
- data/doc/classes/BlockCommand.src/M000007.html +0 -23
- data/doc/classes/BlockCommand.src/M000008.html +0 -24
- data/doc/classes/Command.html +0 -167
- data/doc/classes/Command.src/M000032.html +0 -19
- data/doc/classes/Command.src/M000033.html +0 -18
- data/doc/classes/CommentCommand.html +0 -146
- data/doc/classes/CommentCommand.src/M000009.html +0 -18
- data/doc/classes/IfCommand.html +0 -193
- data/doc/classes/IfCommand.src/M000042.html +0 -19
- data/doc/classes/IfCommand.src/M000043.html +0 -20
- data/doc/classes/IfCommand.src/M000044.html +0 -20
- data/doc/classes/IfElseCommand.html +0 -189
- data/doc/classes/IfElseCommand.src/M000025.html +0 -19
- data/doc/classes/IfElseCommand.src/M000026.html +0 -23
- data/doc/classes/IfElseCommand.src/M000027.html +0 -20
- data/doc/classes/IncludeCommand.html +0 -171
- data/doc/classes/IncludeCommand.src/M000019.html +0 -26
- data/doc/classes/IncludeCommand.src/M000020.html +0 -28
- data/doc/classes/IncludeCommand.src/M000021.html +0 -18
- data/doc/classes/IncludeCommandError.html +0 -118
- data/doc/classes/LoopCommand.html +0 -197
- data/doc/classes/LoopCommand.src/M000001.html +0 -19
- data/doc/classes/LoopCommand.src/M000002.html +0 -42
- data/doc/classes/LoopCommand.src/M000003.html +0 -20
- data/doc/classes/LoopElseCommand.html +0 -190
- data/doc/classes/LoopElseCommand.src/M000022.html +0 -19
- data/doc/classes/LoopElseCommand.src/M000023.html +0 -23
- data/doc/classes/LoopElseCommand.src/M000024.html +0 -20
- data/doc/classes/Namespace.html +0 -297
- data/doc/classes/Namespace.src/M000034.html +0 -19
- data/doc/classes/Namespace.src/M000035.html +0 -18
- data/doc/classes/Namespace.src/M000036.html +0 -18
- data/doc/classes/Namespace.src/M000037.html +0 -19
- data/doc/classes/Namespace.src/M000038.html +0 -36
- data/doc/classes/Namespace.src/M000039.html +0 -21
- data/doc/classes/Namespace.src/M000040.html +0 -18
- data/doc/classes/Namespace.src/M000041.html +0 -18
- data/doc/classes/PageTemplate.html +0 -380
- data/doc/classes/PageTemplate.src/M000010.html +0 -49
- data/doc/classes/PageTemplate.src/M000011.html +0 -18
- data/doc/classes/PageTemplate.src/M000012.html +0 -29
- data/doc/classes/PageTemplate.src/M000013.html +0 -18
- data/doc/classes/PageTemplate.src/M000014.html +0 -18
- data/doc/classes/PageTemplate.src/M000015.html +0 -18
- data/doc/classes/PageTemplate.src/M000016.html +0 -18
- data/doc/classes/PageTemplate.src/M000017.html +0 -18
- data/doc/classes/PageTemplate.src/M000018.html +0 -19
- data/doc/classes/Syntax/CachedParser.html +0 -163
- data/doc/classes/Syntax/CachedParser.src/M000048.html +0 -19
- data/doc/classes/Syntax/CachedParser.src/M000049.html +0 -53
- data/doc/classes/Syntax/Glossary.html +0 -251
- data/doc/classes/Syntax/Glossary.src/M000050.html +0 -20
- data/doc/classes/Syntax/Glossary.src/M000051.html +0 -29
- data/doc/classes/Syntax/Parser.html +0 -261
- data/doc/classes/Syntax/Parser.src/M000052.html +0 -22
- data/doc/classes/Syntax/Parser.src/M000053.html +0 -36
- data/doc/classes/Syntax/Parser.src/M000054.html +0 -18
- data/doc/classes/Syntax/Parser.src/M000055.html +0 -21
- data/doc/classes/Syntax/Parser.src/M000056.html +0 -53
- data/doc/classes/Syntax/Parser.src/M000057.html +0 -111
- data/doc/classes/Syntax.html +0 -139
- data/doc/classes/TextCommand.html +0 -185
- data/doc/classes/TextCommand.src/M000045.html +0 -18
- data/doc/classes/TextCommand.src/M000046.html +0 -18
- data/doc/classes/TextCommand.src/M000047.html +0 -18
- data/doc/classes/UnlessCommand.html +0 -151
- data/doc/classes/UnlessCommand.src/M000028.html +0 -20
- data/doc/classes/ValueCommand.html +0 -186
- data/doc/classes/ValueCommand.src/M000029.html +0 -18
- data/doc/classes/ValueCommand.src/M000030.html +0 -18
- data/doc/classes/ValueCommand.src/M000031.html +0 -20
- data/doc/created.rid +0 -1
- data/doc/files/README_txt.html +0 -224
- data/doc/files/lib/PageTemplate_rb.html +0 -119
- data/doc/fr_class_index.html +0 -44
- data/doc/fr_file_index.html +0 -28
- data/doc/fr_method_index.html +0 -83
- data/doc/index.html +0 -24
- data/doc/rdoc-style.css +0 -208
- data/install.rb +0 -1015
- data/lib/CVS/Entries +0 -2
- data/lib/CVS/Repository +0 -1
- data/lib/CVS/Root +0 -1
- data/lib/PageTemplate.rb~ +0 -1004
- data/pkg/PageTemplate-1.2.0.gem +0 -0
- data/tdata/CVS/Entries +0 -28
- data/tdata/CVS/Repository +0 -1
- data/tdata/CVS/Root +0 -1
- data/tdata/cm.txt +0 -3
- data/tdata/complex.txt +0 -116
- data/tdata/i1.txt +0 -1
- data/tdata/i2.txt +0 -7
- data/tdata/ib1.txt +0 -7
- data/tdata/ib2.txt +0 -13
- data/tdata/ie1.txt +0 -4
- data/tdata/ie2.txt +0 -15
- data/tdata/include.1.txt +0 -1
- data/tdata/include.2.txt +0 -1
- data/tdata/include.3.txt +0 -1
- data/tdata/include.4.nf.out.txt +0 -2
- data/tdata/include.4.out.txt +0 -3
- data/tdata/include.4.txt +0 -2
- data/tdata/include.4a.txt +0 -1
- data/tdata/include.4b.txt +0 -2
- data/tdata/include.5.txt +0 -2
- data/tdata/l1.txt +0 -5
- data/tdata/l2.txt +0 -7
- data/tdata/metadata.1.txt +0 -5
- data/tdata/metadata.2.txt +0 -5
- data/tdata/metadata.3.txt +0 -5
- data/tdata/metadata.4.txt +0 -5
- data/tdata/nm.txt +0 -4
- data/tdata/p/CVS/Entries +0 -5
- data/tdata/p/CVS/Repository +0 -1
- data/tdata/p/CVS/Root +0 -1
- data/tdata/p/CVS/b2.txt,t +0 -0
- data/tdata/p/_b1.txt +0 -0
- data/tdata/p/b1.txt +0 -4
- data/tdata/p/b2.txt +0 -4
- data/tdata/p/b2.txt~ +0 -4
- data/tdata/p/cb1.txt +0 -4
- data/tdata/t.txt +0 -2
- data/tdata/v1.txt +0 -11
- data/tdata/v2.txt +0 -11
data/TC_PageTemplate.rb
DELETED
@@ -1,974 +0,0 @@
|
|
1
|
-
#!/usr/local/bin/ruby -w
|
2
|
-
|
3
|
-
require 'test/unit'
|
4
|
-
require './lib/PageTemplate.rb'
|
5
|
-
|
6
|
-
require "date"
|
7
|
-
|
8
|
-
class TC_Namespace < Test::Unit::TestCase
|
9
|
-
@@namespace = Namespace.new()
|
10
|
-
|
11
|
-
def testNamespaceSet
|
12
|
-
assert(@@namespace.set("name", "Frank"))
|
13
|
-
end
|
14
|
-
|
15
|
-
def testNamespaceGet
|
16
|
-
@@namespace.set("name", "Frank")
|
17
|
-
assert_equal("Frank", @@namespace.get("name"))
|
18
|
-
end
|
19
|
-
|
20
|
-
def testTrue
|
21
|
-
assert_not_nil(@@namespace.true?("name"))
|
22
|
-
assert_nil(@@namespace.true?("null"))
|
23
|
-
@@namespace.set("falseFlag", false)
|
24
|
-
assert_nil(@@namespace.true?("falseFlag"))
|
25
|
-
end
|
26
|
-
|
27
|
-
def testNamespacePush
|
28
|
-
assert_equal("Frank", @@namespace.get("name"))
|
29
|
-
names = { 'name' => "Eddie Baby" }
|
30
|
-
|
31
|
-
# Pushing a hash (and nested namespace)
|
32
|
-
assert(@@namespace.push(names))
|
33
|
-
assert_equal("Eddie Baby", @@namespace.get("name"))
|
34
|
-
|
35
|
-
# Pushing an object
|
36
|
-
date = Date.today()
|
37
|
-
date2 = Date.today()
|
38
|
-
|
39
|
-
@@namespace.push(date)
|
40
|
-
assert_equal(date2.year, @@namespace.get("year"))
|
41
|
-
end
|
42
|
-
|
43
|
-
def testNamespacePop
|
44
|
-
names = { 'name' => "Eddie Baby" }
|
45
|
-
@@namespace.push(names)
|
46
|
-
assert_equal("Eddie Baby", @@namespace.get("name"))
|
47
|
-
assert(@@namespace.pop())
|
48
|
-
assert_equal("Frank", @@namespace.get("name"))
|
49
|
-
assert_nil(@@namespace.pop())
|
50
|
-
end
|
51
|
-
|
52
|
-
end
|
53
|
-
|
54
|
-
class TC_Command < Test::Unit::TestCase
|
55
|
-
@@command = Command.new()
|
56
|
-
|
57
|
-
def testCommandOutput
|
58
|
-
assert_raises(NotImplementedError) { @@command.output() }
|
59
|
-
end
|
60
|
-
|
61
|
-
end
|
62
|
-
|
63
|
-
class TC_CommentCommand < Test::Unit::TestCase
|
64
|
-
@@command = CommentCommand.new()
|
65
|
-
|
66
|
-
def testCommentCommand
|
67
|
-
assert_equal(nil, @@command.output,
|
68
|
-
"CommentCommands don't have any output")
|
69
|
-
end
|
70
|
-
|
71
|
-
end
|
72
|
-
|
73
|
-
class TC_BlockCommand < Test::Unit::TestCase
|
74
|
-
@@command = BlockCommand.new()
|
75
|
-
|
76
|
-
def testAddCommand
|
77
|
-
aCommand = TextCommand.new("Hello")
|
78
|
-
assert(@@command.add(aCommand))
|
79
|
-
|
80
|
-
assert_raises(TypeError) { @@command.add("Hello") }
|
81
|
-
end
|
82
|
-
|
83
|
-
def testOutput
|
84
|
-
bCommand = TextCommand.new(", ")
|
85
|
-
cCommand = TextCommand.new("World")
|
86
|
-
|
87
|
-
@@command.add(bCommand)
|
88
|
-
@@command.add(cCommand)
|
89
|
-
|
90
|
-
assert_equal("Hello, World", @@command.output)
|
91
|
-
end
|
92
|
-
end
|
93
|
-
|
94
|
-
class TC_TextCommand < Test::Unit::TestCase
|
95
|
-
@@command = TextCommand.new("Just testing")
|
96
|
-
|
97
|
-
def testCommandOutput
|
98
|
-
assert_equal("Just testing", @@command.output)
|
99
|
-
end
|
100
|
-
|
101
|
-
end
|
102
|
-
|
103
|
-
class TC_ValueCommand < Test::Unit::TestCase
|
104
|
-
@@valueCommand = ValueCommand.new("name")
|
105
|
-
|
106
|
-
def testOutput
|
107
|
-
ns = Namespace.new()
|
108
|
-
ns.set("name", "Frank")
|
109
|
-
assert_equal(ns.get("name"), @@valueCommand.output(ns))
|
110
|
-
end
|
111
|
-
end
|
112
|
-
|
113
|
-
class TC_IfCommand < Test::Unit::TestCase
|
114
|
-
|
115
|
-
def testOutput
|
116
|
-
aCommand = TextCommand.new("Programming ")
|
117
|
-
bCommand = TextCommand.new("Ruby")
|
118
|
-
commandBlock = BlockCommand.new()
|
119
|
-
commandBlock.add(aCommand)
|
120
|
-
commandBlock.add(bCommand)
|
121
|
-
|
122
|
-
ns = Namespace.new()
|
123
|
-
ns.set("testing", 1)
|
124
|
-
|
125
|
-
# First test for output with true condition
|
126
|
-
ifCommand = IfCommand.new("testing", commandBlock)
|
127
|
-
assert_equal("Programming Ruby", ifCommand.output(ns))
|
128
|
-
|
129
|
-
# Test for nil output with false condition
|
130
|
-
ifCommand = IfCommand.new("production", commandBlock)
|
131
|
-
assert_nil(ifCommand.output(ns))
|
132
|
-
|
133
|
-
ns.set("production", false)
|
134
|
-
assert_nil(ifCommand.output(ns))
|
135
|
-
end
|
136
|
-
end
|
137
|
-
|
138
|
-
class TC_UnlessCommand < Test::Unit::TestCase
|
139
|
-
def testOutput
|
140
|
-
aCommand = TextCommand.new("Dude!")
|
141
|
-
bCommand = TextCommand.new("Sweet!")
|
142
|
-
commandBlock = BlockCommand.new()
|
143
|
-
commandBlock.add(aCommand)
|
144
|
-
commandBlock.add(bCommand)
|
145
|
-
ns = Namespace.new()
|
146
|
-
ns["testing"] = false
|
147
|
-
|
148
|
-
# First test for output with false condition
|
149
|
-
unlessCommand = UnlessCommand.new("testing", commandBlock)
|
150
|
-
assert_equal("Dude!Sweet!", unlessCommand.output(ns))
|
151
|
-
ns["testing"] = true
|
152
|
-
assert_nil(unlessCommand.output(ns))
|
153
|
-
end
|
154
|
-
end
|
155
|
-
|
156
|
-
class TC_IfElseCommand < Test::Unit::TestCase
|
157
|
-
|
158
|
-
def testOutput
|
159
|
-
aCommand = TextCommand.new("This is ")
|
160
|
-
bCommand = TextCommand.new("True")
|
161
|
-
cCommand = TextCommand.new("False")
|
162
|
-
ifBlock = BlockCommand.new()
|
163
|
-
ifBlock.add(aCommand)
|
164
|
-
ifBlock.add(bCommand)
|
165
|
-
elseBlock = BlockCommand.new()
|
166
|
-
elseBlock.add(aCommand)
|
167
|
-
elseBlock.add(cCommand)
|
168
|
-
|
169
|
-
ns = Namespace.new()
|
170
|
-
ns.set("testing", 1)
|
171
|
-
|
172
|
-
# First test for output with true condition
|
173
|
-
ifElseCommand = IfElseCommand.new("testing", ifBlock, elseBlock)
|
174
|
-
assert_equal("This is True", ifElseCommand.output(ns))
|
175
|
-
|
176
|
-
# Test for output with false condition
|
177
|
-
ifElseCommand = IfElseCommand.new("live", ifBlock, elseBlock)
|
178
|
-
assert_equal("This is False", ifElseCommand.output(ns))
|
179
|
-
end
|
180
|
-
|
181
|
-
end
|
182
|
-
|
183
|
-
class TC_LoopCommand < Test::Unit::TestCase
|
184
|
-
|
185
|
-
def testOutput
|
186
|
-
# Build a list of hashes for the namespace
|
187
|
-
loopItems = [
|
188
|
-
{ 'x'=> '1 ', 'y'=> '2 ', 'z'=> '3' },
|
189
|
-
{ 'x'=> 'a ', 'y'=> 'b ', 'z'=> 'c' },
|
190
|
-
]
|
191
|
-
ns = Namespace.new()
|
192
|
-
ns.set('list', loopItems)
|
193
|
-
|
194
|
-
# Build a command list
|
195
|
-
xCommand = ValueCommand.new('x')
|
196
|
-
yCommand = ValueCommand.new('y')
|
197
|
-
zCommand = ValueCommand.new('z')
|
198
|
-
commandBlock = BlockCommand.new()
|
199
|
-
commandBlock.add(xCommand)
|
200
|
-
commandBlock.add(yCommand)
|
201
|
-
commandBlock.add(zCommand)
|
202
|
-
|
203
|
-
loopCommand = LoopCommand.new('list', commandBlock)
|
204
|
-
assert_equal("1 2 3a b c", loopCommand.output(ns))
|
205
|
-
loopCommand = LoopCommand.new('noshow', commandBlock)
|
206
|
-
assert_nil(loopCommand.output(ns))
|
207
|
-
ns.set("string", "hello")
|
208
|
-
loopCommand = LoopCommand.new("string", commandBlock)
|
209
|
-
assert_raises(TypeError) { loopCommand.output(ns) }
|
210
|
-
end
|
211
|
-
end
|
212
|
-
|
213
|
-
class TC_LoopElseCommand < Test::Unit::TestCase
|
214
|
-
|
215
|
-
def testOutput
|
216
|
-
# Build a list of hashes for the namespace
|
217
|
-
loopItems = [
|
218
|
-
{ 'x'=> '1 ', 'y'=> '2 ', 'z'=> '3' },
|
219
|
-
{ 'x'=> 'a ', 'y'=> 'b ', 'z'=> 'c' },
|
220
|
-
]
|
221
|
-
ns = Namespace.new()
|
222
|
-
ns.set('list', loopItems)
|
223
|
-
|
224
|
-
# Build a command list
|
225
|
-
xCommand = ValueCommand.new('x')
|
226
|
-
yCommand = ValueCommand.new('y')
|
227
|
-
zCommand = ValueCommand.new('z')
|
228
|
-
commandBlock = BlockCommand.new()
|
229
|
-
commandBlock.add(xCommand)
|
230
|
-
commandBlock.add(yCommand)
|
231
|
-
commandBlock.add(zCommand)
|
232
|
-
|
233
|
-
# Build a command list for the else block
|
234
|
-
aCommand = TextCommand.new("In the else block")
|
235
|
-
elseCommands = BlockCommand.new()
|
236
|
-
elseCommands.add(aCommand)
|
237
|
-
|
238
|
-
# Build the LoopCommand
|
239
|
-
loopCommand =
|
240
|
-
LoopElseCommand.new('list', commandBlock, elseCommands)
|
241
|
-
|
242
|
-
# Test for output when loop variable is true
|
243
|
-
assert_equal("1 2 3a b c", loopCommand.output(ns))
|
244
|
-
|
245
|
-
# Test for nil when loop variable is false
|
246
|
-
loopCommand =
|
247
|
-
LoopElseCommand.new('noshow', commandBlock, elseCommands)
|
248
|
-
assert_equal("In the else block", loopCommand.output(ns))
|
249
|
-
end
|
250
|
-
|
251
|
-
end
|
252
|
-
|
253
|
-
|
254
|
-
class TC_NestedCommands < Test::Unit::TestCase
|
255
|
-
|
256
|
-
def testNestedIfs
|
257
|
-
ns = Namespace.new()
|
258
|
-
|
259
|
-
innerBlock = BlockCommand.new()
|
260
|
-
innerBlock.add(TextCommand.new("Inner"))
|
261
|
-
innerIf = IfCommand.new("inner", innerBlock)
|
262
|
-
|
263
|
-
outerBlock = BlockCommand.new()
|
264
|
-
outerBlock.add(TextCommand.new("Outer"))
|
265
|
-
outerBlock.add(innerIf)
|
266
|
-
outerIf = IfCommand.new("outer", outerBlock)
|
267
|
-
|
268
|
-
mainBlock = BlockCommand.new()
|
269
|
-
mainBlock.add(outerIf)
|
270
|
-
|
271
|
-
# True in a true should yield result of both command lists
|
272
|
-
ns.set("outer", 1)
|
273
|
-
ns.set("inner", 1)
|
274
|
-
assert_equal("OuterInner", mainBlock.output(ns))
|
275
|
-
|
276
|
-
# False in a true should yield result of outside list
|
277
|
-
ns.set("inner", false)
|
278
|
-
assert_equal("Outer", mainBlock.output(ns))
|
279
|
-
|
280
|
-
# False in a false should yield nil
|
281
|
-
ns.set("outer", false)
|
282
|
-
assert_nil(mainBlock.output(ns))
|
283
|
-
|
284
|
-
# True in a false should yield nil
|
285
|
-
ns.set("inner", 1)
|
286
|
-
ns.set("outer", false)
|
287
|
-
assert_nil(mainBlock.output(ns))
|
288
|
-
end
|
289
|
-
|
290
|
-
def testNestedLoops
|
291
|
-
loop1 = [
|
292
|
-
{ 'a' => 'o1 ', 'b' => 'o2 ', 'c' => [
|
293
|
-
{ 'x' => 'i1 ', 'y' => 'i2 ', 'z' => 'i3 ' },
|
294
|
-
{ 'x' => 'i4 ', 'y' => 'i5 ', 'z' => 'i6 ' } ]
|
295
|
-
},
|
296
|
-
{ 'a' => 'o3 ', 'b' => 'o4 ', 'c' => [
|
297
|
-
{ 'x' => 'j1 ', 'y' => 'j2 ', 'z' => 'j3 ' },
|
298
|
-
{ 'x' => 'j4 ', 'y' => 'j5 ', 'z' => 'j6 ' } ]
|
299
|
-
}
|
300
|
-
]
|
301
|
-
ns = Namespace.new()
|
302
|
-
ns.set("loop", loop1)
|
303
|
-
|
304
|
-
aCommand = ValueCommand.new('a')
|
305
|
-
bCommand = ValueCommand.new('b')
|
306
|
-
xCommand = ValueCommand.new('x')
|
307
|
-
yCommand = ValueCommand.new('y')
|
308
|
-
zCommand = ValueCommand.new('z')
|
309
|
-
innerBlock = BlockCommand.new()
|
310
|
-
innerBlock.add(xCommand)
|
311
|
-
innerBlock.add(yCommand)
|
312
|
-
innerBlock.add(zCommand)
|
313
|
-
cCommand = LoopCommand.new('c', innerBlock)
|
314
|
-
outerBlock = BlockCommand.new()
|
315
|
-
outerBlock.add(aCommand)
|
316
|
-
outerBlock.add(bCommand)
|
317
|
-
outerBlock.add(cCommand)
|
318
|
-
loopCommand = LoopCommand.new('loop', outerBlock)
|
319
|
-
|
320
|
-
# Loop in a loop should yield lots of text ;-)
|
321
|
-
# 'o1 o2 i1 i2 i3 i4 i5 i6 o3 o4 j1 j2 j3 j4 j5 j6 '
|
322
|
-
assert_equal('o1 o2 i1 i2 i3 i4 i5 i6 o3 o4 j1 j2 j3 j4 j5 j6 ',
|
323
|
-
loopCommand.output(ns))
|
324
|
-
|
325
|
-
# False in a loop should yield outside loop
|
326
|
-
# 'o1 o2 o3 o4 '
|
327
|
-
loop1.each { |item| item['c'] = [] }
|
328
|
-
assert_equal('o1 o2 o3 o4 ', loopCommand.output(ns))
|
329
|
-
end
|
330
|
-
|
331
|
-
def testMixedNesting
|
332
|
-
# Loop in If
|
333
|
-
loop1 = [
|
334
|
-
{ 'a' => '1 ', 'b' => '2 ', 'c' => '3 ' },
|
335
|
-
{ 'a' => 'x ', 'b' => 'y ', 'c' => 'z ' }
|
336
|
-
]
|
337
|
-
|
338
|
-
aCommand = ValueCommand.new('a')
|
339
|
-
bCommand = ValueCommand.new('b')
|
340
|
-
cCommand = ValueCommand.new('c')
|
341
|
-
loopBlock = BlockCommand.new()
|
342
|
-
loopBlock.add(aCommand)
|
343
|
-
loopBlock.add(bCommand)
|
344
|
-
loopBlock.add(cCommand)
|
345
|
-
loopCommand = LoopCommand.new("loop", loopBlock)
|
346
|
-
ifBlock = BlockCommand.new()
|
347
|
-
ifBlock.add(loopCommand)
|
348
|
-
ifCommand = IfCommand.new("flag", ifBlock)
|
349
|
-
|
350
|
-
ns = Namespace.new()
|
351
|
-
ns.set("loop", loop1)
|
352
|
-
ns.set("flag", 1)
|
353
|
-
assert_equal("1 2 3 x y z ", ifCommand.output(ns))
|
354
|
-
ns.set("flag", false)
|
355
|
-
assert_nil(ifCommand.output(ns))
|
356
|
-
|
357
|
-
# If in Loop
|
358
|
-
|
359
|
-
dCommand = TextCommand.new("(true)")
|
360
|
-
ifBlock = BlockCommand.new()
|
361
|
-
ifBlock.add(dCommand)
|
362
|
-
ifCommand = IfCommand.new("flag", ifBlock)
|
363
|
-
loopBlock = BlockCommand.new()
|
364
|
-
loopBlock.add(aCommand)
|
365
|
-
loopBlock.add(bCommand)
|
366
|
-
loopBlock.add(cCommand)
|
367
|
-
loopBlock.add(ifCommand)
|
368
|
-
loopCommand = LoopCommand.new("loop", loopBlock)
|
369
|
-
|
370
|
-
loop1[-1]['flag'] = 1
|
371
|
-
assert_equal("1 2 3 x y z (true)", loopCommand.output(ns))
|
372
|
-
loop1[-1]['flag'] = false
|
373
|
-
assert_equal("1 2 3 x y z ", loopCommand.output(ns))
|
374
|
-
end
|
375
|
-
|
376
|
-
end
|
377
|
-
|
378
|
-
class TC_SyntaxGlossary < Test::Unit::TestCase
|
379
|
-
@@syntax = Syntax::Glossary.new( /\[%(.+?)%\]/,
|
380
|
-
'value' => /var (\w+)/,
|
381
|
-
'ifopen' => /if (\w+)/,
|
382
|
-
'ifclose' => /endif/,
|
383
|
-
'unlessopen' => /unless (\w+)/,
|
384
|
-
'unlessclose' => /endunless/,
|
385
|
-
'ifbranch' => /else/,
|
386
|
-
'loopopen' => /in (\w+)/,
|
387
|
-
'loopclose' => /endin/,
|
388
|
-
'loopbranch' => /no/,
|
389
|
-
'include' => /include (\w+)/,
|
390
|
-
'comment' => /--.+?--/
|
391
|
-
)
|
392
|
-
|
393
|
-
def testGlossary
|
394
|
-
assert_equal(/\[%(.+?)%\]/, @@syntax.directive)
|
395
|
-
assert_equal(/in (\w+)/, @@syntax.glossary['loopopen'])
|
396
|
-
|
397
|
-
badSyntax = {
|
398
|
-
'flargle' => /flargle/
|
399
|
-
}
|
400
|
-
assert_raises(ArgumentError) {
|
401
|
-
Syntax::Glossary.new(/%(.+?)%/, badSyntax)
|
402
|
-
}
|
403
|
-
end
|
404
|
-
|
405
|
-
def testLookup
|
406
|
-
assert_equal(["value", "name"], @@syntax.lookup("var name"))
|
407
|
-
assert_equal(["ifopen", "name"], @@syntax.lookup("if name"))
|
408
|
-
assert_equal(["ifclose", nil], @@syntax.lookup("endif"))
|
409
|
-
assert_equal(["ifbranch", nil], @@syntax.lookup("else"))
|
410
|
-
assert_equal(["loopopen", "x"], @@syntax.lookup("in x"))
|
411
|
-
assert_equal(["loopclose", nil], @@syntax.lookup("endin"))
|
412
|
-
assert_equal(["loopbranch", nil], @@syntax.lookup("no"))
|
413
|
-
assert_equal(["include", "foo"], @@syntax.lookup("include foo"))
|
414
|
-
assert_equal(["comment", nil], @@syntax.lookup("-- blarg! --"))
|
415
|
-
assert_nil(@@syntax.lookup("foo"))
|
416
|
-
assert_nil(@@syntax.lookup("foo bar"))
|
417
|
-
end
|
418
|
-
|
419
|
-
end
|
420
|
-
|
421
|
-
class TC_SyntaxParser < Test::Unit::TestCase
|
422
|
-
@@parser = Syntax::Parser.new(Syntax::DEFAULT)
|
423
|
-
|
424
|
-
def testParse
|
425
|
-
assert_equal([[1, ""]], @@parser.parse([""]))
|
426
|
-
assert_equal([
|
427
|
-
[1, "Hello "],
|
428
|
-
[1, ["value", "world"]],
|
429
|
-
[1, ""]
|
430
|
-
], @@parser.parse(["Hello [%var world%]"])
|
431
|
-
)
|
432
|
-
|
433
|
-
assert_equal([
|
434
|
-
[1, ""],
|
435
|
-
[1, ["value", "articleno"]],
|
436
|
-
[1, ""]
|
437
|
-
], @@parser.parse(["[%var articleno%]"]))
|
438
|
-
assert_equal([
|
439
|
-
[1, ""],
|
440
|
-
[1, ["value", "articleno"]],
|
441
|
-
[1, ""]
|
442
|
-
], @@parser.parse(["[% var articleno %\]"]))
|
443
|
-
|
444
|
-
multiline = [
|
445
|
-
"Hello [%var world%\]",
|
446
|
-
"[%if return%]",
|
447
|
-
"Welcome Back!",
|
448
|
-
"[%endif%]"
|
449
|
-
]
|
450
|
-
|
451
|
-
mResult = [
|
452
|
-
[1, "Hello "],
|
453
|
-
[1, ["value", "world"]],
|
454
|
-
[1, ""],
|
455
|
-
[2, ""],
|
456
|
-
[2, ["ifopen", "return"]],
|
457
|
-
[2, ""],
|
458
|
-
[3, "Welcome Back!"],
|
459
|
-
[4, ""],
|
460
|
-
[4, ["ifclose", nil]],
|
461
|
-
[4, ""]
|
462
|
-
]
|
463
|
-
|
464
|
-
assert_equal(mResult, @@parser.parse(multiline))
|
465
|
-
|
466
|
-
multiline = [
|
467
|
-
"Hello [%var world%\]",
|
468
|
-
"[%unless return%]",
|
469
|
-
"Welcome!",
|
470
|
-
"[%endunless%]"
|
471
|
-
]
|
472
|
-
|
473
|
-
mResult = [
|
474
|
-
[1, "Hello "],
|
475
|
-
[1, ["value", "world"]],
|
476
|
-
[1, ""],
|
477
|
-
[2, ""],
|
478
|
-
[2, ["unlessopen", "return"]],
|
479
|
-
[2, ""],
|
480
|
-
[3, "Welcome!"],
|
481
|
-
[4, ""],
|
482
|
-
[4, ["unlessclose", nil]],
|
483
|
-
[4, ""]
|
484
|
-
]
|
485
|
-
|
486
|
-
assert_equal(mResult, @@parser.parse(multiline))
|
487
|
-
|
488
|
-
end
|
489
|
-
|
490
|
-
def testCompile
|
491
|
-
directives = [
|
492
|
-
"Hello [%var world%]",
|
493
|
-
"[%if return%]",
|
494
|
-
"Welcome Back!",
|
495
|
-
"[%endif%]"
|
496
|
-
]
|
497
|
-
assert(@@parser.compile(@@parser.parse(directives)))
|
498
|
-
|
499
|
-
directives = [
|
500
|
-
"Hello [%var world%]",
|
501
|
-
"[%unless return%]",
|
502
|
-
"Welcome!",
|
503
|
-
"[%endunless%]"
|
504
|
-
]
|
505
|
-
assert(@@parser.compile(@@parser.parse(directives)))
|
506
|
-
end
|
507
|
-
|
508
|
-
def testBuild
|
509
|
-
assert(@@parser.build("tdata/p/b1.txt"))
|
510
|
-
# Make sure nothing panics if we ask for the commands again.
|
511
|
-
assert(@@parser.build("tdata/p/b1.txt"))
|
512
|
-
assert(@@parser.build("tdata/p/b2.txt"))
|
513
|
-
end
|
514
|
-
end
|
515
|
-
|
516
|
-
class TC_SyntaxCachedParser < Test::Unit::TestCase
|
517
|
-
@@parser = Syntax::CachedParser.new(Syntax::DEFAULT)
|
518
|
-
|
519
|
-
def testBuild
|
520
|
-
assert(@@parser.build("tdata/p/b1.txt"))
|
521
|
-
assert(File.exists?("tdata/p/_b1.txt"))
|
522
|
-
|
523
|
-
ns = Namespace.new()
|
524
|
-
ns["world"] = "World"
|
525
|
-
assert(@@parser.output(ns))
|
526
|
-
end
|
527
|
-
|
528
|
-
def testCachedBuild
|
529
|
-
assert(@@parser.build("tdata/p/cb1.txt"))
|
530
|
-
assert(File.exists?("tdata/p/_cb1.txt"))
|
531
|
-
assert(@@parser.reset)
|
532
|
-
assert(@@parser.build("tdata/p/cb1.txt"))
|
533
|
-
end
|
534
|
-
|
535
|
-
def testCachedRebuild
|
536
|
-
# Create a new parser and build with the cached information.
|
537
|
-
p2 = Syntax::CachedParser.new(Syntax::DEFAULT)
|
538
|
-
assert(p2.build("tdata/p/cb1.txt"))
|
539
|
-
|
540
|
-
# Clean up after ourselves.
|
541
|
-
system("rm -f tdata/p/_cb1.txt")
|
542
|
-
end
|
543
|
-
end
|
544
|
-
|
545
|
-
class TC_PageTemplate < Test::Unit::TestCase
|
546
|
-
@@template = PageTemplate.new( 'syntax' => Syntax::DEFAULT )
|
547
|
-
|
548
|
-
def testLoadFile
|
549
|
-
assert(@@template.load("tdata/t.txt"))
|
550
|
-
assert_equal("tdata/t.txt", @@template.file)
|
551
|
-
assert_raises(ArgumentError) { @@template.load("tdata/null") }
|
552
|
-
end
|
553
|
-
|
554
|
-
def testInitializeTemplate
|
555
|
-
assert(PageTemplate.new())
|
556
|
-
assert(PageTemplate.new("filename" => "tdata/t.txt"))
|
557
|
-
assert_raises(ArgumentError) { PageTemplate.new("filename" => "tdata/null") }
|
558
|
-
end
|
559
|
-
|
560
|
-
def testSetParameter
|
561
|
-
assert(@@template.setParameter("name", "PageTemplate"))
|
562
|
-
end
|
563
|
-
|
564
|
-
def testGetParameter
|
565
|
-
@@template.setParameter("name", "PageTemplate")
|
566
|
-
assert_equal("PageTemplate", @@template.getParameter("name"))
|
567
|
-
assert_nil(@@template.getParameter("null"))
|
568
|
-
end
|
569
|
-
|
570
|
-
def testHashAccess
|
571
|
-
@@template['hash'] = 'test'
|
572
|
-
assert_equal('test', @@template['hash'])
|
573
|
-
end
|
574
|
-
|
575
|
-
def testOutputNoMarkup
|
576
|
-
@@template.load("tdata/nm.txt")
|
577
|
-
cmpFile = File.open("tdata/nm.txt").read()
|
578
|
-
assert_equal(cmpFile, @@template.output())
|
579
|
-
end
|
580
|
-
|
581
|
-
def testOutputCommentMarkup
|
582
|
-
@@template.load("tdata/cm.txt")
|
583
|
-
assert(@@template.output !~ /\[%--/)
|
584
|
-
end
|
585
|
-
|
586
|
-
def testOutputValueMarkup
|
587
|
-
|
588
|
-
# Valid markup, value exists.
|
589
|
-
@@template['title'] = "ValueMarkup"
|
590
|
-
@@template.load("tdata/v1.txt")
|
591
|
-
assert(@@template.output =~ /<h1>ValueMarkup<\/h1>/)
|
592
|
-
|
593
|
-
# Valid markup, value does not exist.
|
594
|
-
@@template['title'] = ""
|
595
|
-
assert(@@template.output =~ /<h1><\/h1>/)
|
596
|
-
|
597
|
-
# Invalid markup.
|
598
|
-
@@template.load("tdata/v2.txt")
|
599
|
-
assert(@@template.output =~ /<h1>title%\]<\/h1>/)
|
600
|
-
end
|
601
|
-
|
602
|
-
def testOutputUnlessMarkup
|
603
|
-
@@template['return'] = true
|
604
|
-
@@template.load("tdata/p/b2.txt")
|
605
|
-
assert(@@template.output !~ /Welcome/)
|
606
|
-
@@template['return'] = false
|
607
|
-
assert(@@template.output =~ /Welcome/)
|
608
|
-
end
|
609
|
-
|
610
|
-
def testOutputIfMarkup
|
611
|
-
@@template['flag'] = true
|
612
|
-
@@template.load("tdata/i1.txt")
|
613
|
-
assert(@@template.output =~ /It's all true!/)
|
614
|
-
|
615
|
-
@@template['flag'] = false
|
616
|
-
assert(@@template.output !~ /It's all true!/)
|
617
|
-
|
618
|
-
# Nested if expressions
|
619
|
-
@@template.load("tdata/i2.txt")
|
620
|
-
|
621
|
-
# 1. Both true.
|
622
|
-
@@template['outer'] = true
|
623
|
-
@@template['inner'] = true
|
624
|
-
assert(@@template.output =~ /This is outer text/)
|
625
|
-
assert(@@template.output =~ /This is inner text/)
|
626
|
-
|
627
|
-
# 2. Outer true, inner false.
|
628
|
-
@@template['outer'] = true
|
629
|
-
@@template['inner'] = false
|
630
|
-
assert(@@template.output =~ /This is outer text/)
|
631
|
-
assert(@@template.output !~ /This is inner text/)
|
632
|
-
|
633
|
-
# 3. Inner true, outer false.
|
634
|
-
@@template['outer'] = false
|
635
|
-
@@template['inner'] = true
|
636
|
-
assert(@@template.output !~ /This is outer text/)
|
637
|
-
assert(@@template.output !~ /This is inner text/)
|
638
|
-
end
|
639
|
-
|
640
|
-
def testOutputIfBranchMarkup
|
641
|
-
@@template.load("tdata/ie1.txt")
|
642
|
-
|
643
|
-
# True: if block executes, not else block
|
644
|
-
@@template["flag"] = true
|
645
|
-
assert(@@template.output =~ /It's all true!/)
|
646
|
-
assert(@@template.output !~ /Nothing is true/)
|
647
|
-
|
648
|
-
# False: else block executes, not if block
|
649
|
-
@@template["flag"] = false
|
650
|
-
assert(@@template.output =~ /Nothing is true/)
|
651
|
-
assert(@@template.output !~ /It's all true!/)
|
652
|
-
end
|
653
|
-
|
654
|
-
def testOutputNestedIfBranchMarkup
|
655
|
-
@@template.load("tdata/ie2.txt")
|
656
|
-
|
657
|
-
# Outer true, inner true
|
658
|
-
@@template['outer'] = true
|
659
|
-
@@template['inner'] = true
|
660
|
-
assert(@@template.output =~ /Outer is true/)
|
661
|
-
assert(@@template.output =~ /Inner is true/)
|
662
|
-
|
663
|
-
# Outer true, inner false
|
664
|
-
@@template['outer'] = true
|
665
|
-
@@template['inner'] = false
|
666
|
-
assert(@@template.output =~ /Outer is true/)
|
667
|
-
assert(@@template.output =~ /Inner is false/)
|
668
|
-
|
669
|
-
# Outer false, inner true
|
670
|
-
@@template['outer'] = false
|
671
|
-
@@template['inner'] = true
|
672
|
-
assert(@@template.output =~ /Outer is false/)
|
673
|
-
assert(@@template.output =~ /Inner is true/)
|
674
|
-
|
675
|
-
# Outer false, inner false
|
676
|
-
@@template['outer'] = false
|
677
|
-
@@template['inner'] = false
|
678
|
-
assert(@@template.output =~ /Outer is false/)
|
679
|
-
assert(@@template.output =~ /Inner is false/)
|
680
|
-
end
|
681
|
-
|
682
|
-
def testOutputLoopMarkup
|
683
|
-
@@template.load("tdata/l1.txt")
|
684
|
-
|
685
|
-
# Loop Exists
|
686
|
-
myLoop = []
|
687
|
-
1.upto(5) { |v| myLoop << {'value' => v} }
|
688
|
-
|
689
|
-
@@template['loop'] = myLoop
|
690
|
-
assert(@@template.output =~ /<li>3<\/li>/)
|
691
|
-
|
692
|
-
# Loop Doesn't Exist
|
693
|
-
@@template['loop'] = false
|
694
|
-
assert(@@template.output !~ /<li>3<\/li>/)
|
695
|
-
|
696
|
-
# Loop Is Empty List
|
697
|
-
@@template['loop'] = []
|
698
|
-
assert(@@template.output !~ /<li>.*?<\/li>/)
|
699
|
-
end
|
700
|
-
|
701
|
-
def testLoopMetavariables
|
702
|
-
@@template.load("tdata/metadata.1.txt")
|
703
|
-
myLoop = []
|
704
|
-
1.upto(5) { |v| myLoop << {'v' => v} }
|
705
|
-
|
706
|
-
@@template['loop'] = myLoop
|
707
|
-
assert(@@template.output =~ /<li>--1--<\/li>/,
|
708
|
-
"__FIRST__ is set for the first iteration through a loop")
|
709
|
-
assert(@@template.output =~ /<li>5<\/li>/,
|
710
|
-
"__FIRST__ is unset after the first iteration through a loop")
|
711
|
-
|
712
|
-
@@template.load("tdata/metadata.2.txt")
|
713
|
-
assert(@@template.output =~ /<li>--5--<\/li>/,
|
714
|
-
"__LAST__ is set for the last iteration through a loop")
|
715
|
-
assert(@@template.output =~ /<li>1<\/li>/,
|
716
|
-
"__LAST__ is unset before the last iteration through a loop")
|
717
|
-
|
718
|
-
@@template.load("tdata/metadata.3.txt")
|
719
|
-
assert(@@template.output =~ /<li>--1--<\/li>/,
|
720
|
-
"__ODD__ is set for odd-numbered iterations through a loop (1st, 3rd, etc)")
|
721
|
-
assert(@@template.output =~ /<li>2<\/li>/,
|
722
|
-
"__ODD__ is unset for even-numbered iterations through a loop (2nd, 4th, etc)")
|
723
|
-
end
|
724
|
-
|
725
|
-
def testOutputNestedLoopMarkup
|
726
|
-
@@template.load("tdata/l2.txt")
|
727
|
-
|
728
|
-
# Outer Loop Exists, Inner Loop Exists
|
729
|
-
innerLoop = []
|
730
|
-
'a'.upto('f') { |v| innerLoop << { 'value' => v } }
|
731
|
-
outerLoop = []
|
732
|
-
1.upto(5) do |v|
|
733
|
-
outerLoop << {'value' => v, 'inner' => innerLoop}
|
734
|
-
end
|
735
|
-
@@template['loop'] = outerLoop
|
736
|
-
assert(@@template.output =~ /<li>\d/)
|
737
|
-
assert(@@template.output =~ /<li>[a-f]<\/li>/)
|
738
|
-
|
739
|
-
# Outer Loop Exists, Inner Loop Empty
|
740
|
-
outerLoop.each { |x| x['inner'] = [] }
|
741
|
-
assert(@@template.output !~ /<li>[a-f]<\/li>/)
|
742
|
-
|
743
|
-
# Outer Loop Exists, Alternate Inner Loops Empty
|
744
|
-
outerLoop.each_with_index do |x, i|
|
745
|
-
x['inner'] = innerLoop if i % 2 == 0
|
746
|
-
end
|
747
|
-
assert(@@template.output =~ /<li>4\s+?<ul><\/ul>/m)
|
748
|
-
assert(@@template.output =~ /<li>3\s+?<ul><li>a/m)
|
749
|
-
|
750
|
-
# Outer Loop Empty
|
751
|
-
@@template['loop'] = false
|
752
|
-
assert(@@template.output !~ /<li>/)
|
753
|
-
end
|
754
|
-
|
755
|
-
def testOutputLoopBranchMarkup
|
756
|
-
@@template.load("tdata/ib1.txt")
|
757
|
-
|
758
|
-
# Loop exists
|
759
|
-
myLoop = []
|
760
|
-
1.upto(5) { |v| myLoop << {'value' => v} }
|
761
|
-
@@template['loop'] = myLoop
|
762
|
-
assert(@@template.output =~ /<li>\d<\/li>/)
|
763
|
-
assert(@@template.output !~ /No values/)
|
764
|
-
|
765
|
-
# No loop
|
766
|
-
@@template['loop'] = []
|
767
|
-
assert(@@template.output !~ /<li>\d<\/li>/)
|
768
|
-
assert(@@template.output =~ /No values/)
|
769
|
-
end
|
770
|
-
|
771
|
-
def testOutputNestedLoopBranchMarkup
|
772
|
-
@@template.load("tdata/ib2.txt")
|
773
|
-
# Outer Loop Exists, Inner Loop Exists
|
774
|
-
innerLoop = []
|
775
|
-
'a'.upto('f') { |v| innerLoop << { 'value' => v } }
|
776
|
-
outerLoop = []
|
777
|
-
1.upto(5) do |v|
|
778
|
-
outerLoop << {'value' => v, 'inner' => innerLoop}
|
779
|
-
end
|
780
|
-
@@template['loop'] = outerLoop
|
781
|
-
assert(@@template.output =~ /<li>\d/)
|
782
|
-
assert(@@template.output =~ /<li>[a-f]<\/li>/)
|
783
|
-
|
784
|
-
# Outer Loop Exists, Inner Loop Empty
|
785
|
-
outerLoop.each { |x| x['inner'] = [] }
|
786
|
-
assert(@@template.output =~ /No inner values/)
|
787
|
-
|
788
|
-
# Outer Loop Exists, Alternate Inner Loops Empty
|
789
|
-
outerLoop.each_with_index do |x, i|
|
790
|
-
x['inner'] = innerLoop if i % 2 == 0
|
791
|
-
end
|
792
|
-
assert(@@template.output =~ /<li>4\s+?<ul>.+?No inner values/m)
|
793
|
-
assert(@@template.output =~ /<li>3\s+?<ul>.+?<li>a/m)
|
794
|
-
|
795
|
-
# Outer Loop Empty
|
796
|
-
@@template['loop'] = false
|
797
|
-
assert(@@template.output =~ /No values/)
|
798
|
-
end
|
799
|
-
|
800
|
-
def testOutputComplexMarkup
|
801
|
-
title = "Testing"
|
802
|
-
reverse = true
|
803
|
-
|
804
|
-
languages = [
|
805
|
-
{ 'name'=> 'C', 'author'=> 'Dennis Ritchie' },
|
806
|
-
{ 'name'=> 'C++', 'author'=> 'Bjarne Stroustrup' },
|
807
|
-
{ 'name'=> 'Perl', 'author'=> 'Larry Wall',
|
808
|
-
'guideline'=> 'TMTOWTDI - There\'s More Than One Way To Do It'},
|
809
|
-
{ 'name'=> 'Python', 'author'=> 'Guido van Rossum',
|
810
|
-
'guideline'=> 'There Should Be One Obvious Way To Do It' },
|
811
|
-
{ 'name'=> 'Ruby', 'author'=> 'Yukihiro Matsumoto',
|
812
|
-
'guideline'=> 'TPOL - The Principle Of Least Surprise'}
|
813
|
-
]
|
814
|
-
|
815
|
-
favorites = [
|
816
|
-
{ 'topic'=> 'Interesting Comic Books',
|
817
|
-
'items'=> [
|
818
|
-
{'title'=> 'Dropsie Avenue',
|
819
|
-
'creator'=> 'Will Eisner'},
|
820
|
-
{'title'=> 'Cerebus',
|
821
|
-
'creator'=> 'Dave Sim'},
|
822
|
-
{'title'=> 'Jar Of Fools',
|
823
|
-
'creator'=> 'Jason Lutes'}]},
|
824
|
-
{ 'topic'=> 'Favorite Albums',
|
825
|
-
'items'=> [
|
826
|
-
{'title'=> 'Amnesiac',
|
827
|
-
'creator'=> 'Radiohead'},
|
828
|
-
{'title'=> 'The Moon and Antarctica',
|
829
|
-
'creator'=> 'Modest Mouse'},
|
830
|
-
{'title'=> 'Dirt Track Date',
|
831
|
-
'creator'=> 'Southern Culture On The Skids'},
|
832
|
-
{'title'=> 'My Motor',
|
833
|
-
'creator'=> 'Dorkweed'},
|
834
|
-
{'title'=> 'Swordfishtrombones',
|
835
|
-
'creator'=> 'Tom Waits'}]}
|
836
|
-
]
|
837
|
-
|
838
|
-
page = PageTemplate.new('filename' => "tdata/complex.txt")
|
839
|
-
page.setParameter("title", title)
|
840
|
-
page.setParameter("ifTest", 1)
|
841
|
-
page.setParameter("languages", languages)
|
842
|
-
page.setParameter("favorites", favorites)
|
843
|
-
if reverse == 1
|
844
|
-
page.setParameter("reverse", 1)
|
845
|
-
end
|
846
|
-
|
847
|
-
assert(page.output)
|
848
|
-
end
|
849
|
-
|
850
|
-
def testCachedTemplate
|
851
|
-
assert(ct = PageTemplate.new('filename' => "tdata/complex.txt",
|
852
|
-
'use_cache' => true
|
853
|
-
))
|
854
|
-
|
855
|
-
languages = [
|
856
|
-
{ 'name'=> 'C', 'author'=> 'Dennis Ritchie' },
|
857
|
-
{ 'name'=> 'C++', 'author'=> 'Bjarne Stroustrup' },
|
858
|
-
{ 'name'=> 'Perl', 'author'=> 'Larry Wall',
|
859
|
-
'guideline'=> 'TMTOWTDI - There\'s More Than One Way To Do It'},
|
860
|
-
{ 'name'=> 'Python', 'author'=> 'Guido van Rossum',
|
861
|
-
'guideline'=> 'There Should Be One Obvious Way To Do It' },
|
862
|
-
{ 'name'=> 'Ruby', 'author'=> 'Yukihiro Matsumoto',
|
863
|
-
'guideline'=> 'TPOL - The Principle Of Least Surprise'}
|
864
|
-
]
|
865
|
-
|
866
|
-
favorites = [
|
867
|
-
{ 'topic'=> 'Interesting Comic Books',
|
868
|
-
'items'=> [
|
869
|
-
{'title'=> 'Dropsie Avenue',
|
870
|
-
'creator'=> 'Will Eisner'},
|
871
|
-
{'title'=> 'Cerebus',
|
872
|
-
'creator'=> 'Dave Sim'},
|
873
|
-
{'title'=> 'Jar Of Fools',
|
874
|
-
'creator'=> 'Jason Lutes'}]},
|
875
|
-
{ 'topic'=> 'Favorite Albums',
|
876
|
-
'items'=> [
|
877
|
-
{'title'=> 'Amnesiac',
|
878
|
-
'creator'=> 'Radiohead'},
|
879
|
-
{'title'=> 'The Moon and Antarctica',
|
880
|
-
'creator'=> 'Modest Mouse'},
|
881
|
-
{'title'=> 'Dirt Track Date',
|
882
|
-
'creator'=> 'Southern Culture On The Skids'},
|
883
|
-
{'title'=> 'My Motor',
|
884
|
-
'creator'=> 'Dorkweed'},
|
885
|
-
{'title'=> 'Swordfishtrombones',
|
886
|
-
'creator'=> 'Tom Waits'}]}
|
887
|
-
]
|
888
|
-
ct["languages"] = languages
|
889
|
-
ct["favorites"] = favorites
|
890
|
-
assert(ct.output)
|
891
|
-
assert(File.exists?("tdata/_complex.txt"))
|
892
|
-
system("rm -f tdata/_complex.txt")
|
893
|
-
|
894
|
-
end
|
895
|
-
|
896
|
-
def testClearFile
|
897
|
-
assert(@@template.clearFile)
|
898
|
-
end
|
899
|
-
end
|
900
|
-
|
901
|
-
class TC_Include < Test::Unit::TestCase
|
902
|
-
def testIncludeCommand()
|
903
|
-
ns = Namespace.new()
|
904
|
-
|
905
|
-
incCommand = IncludeCommand.new("tdata/include.1.txt")
|
906
|
-
text = File.open("tdata/include.1.txt").read()
|
907
|
-
assert_equal(text, incCommand.output(ns),
|
908
|
-
"IncludeCommands can be initialized with relative filenames")
|
909
|
-
|
910
|
-
text = File.open("tdata/include.2.txt").read()
|
911
|
-
incCommand = IncludeCommand.new("tdata/include.2.txt")
|
912
|
-
assert_equal(text, incCommand.output(ns))
|
913
|
-
|
914
|
-
# Including text with template markup.
|
915
|
-
ns["x"] = "Dude!"
|
916
|
-
pt = PageTemplate.new()
|
917
|
-
pt.load("tdata/include.3.txt")
|
918
|
-
pt["x"] = "Dude!"
|
919
|
-
incCommand = IncludeCommand.new("tdata/include.3.txt")
|
920
|
-
assert_equal(pt.output(), incCommand.output(ns),
|
921
|
-
"Include Commands can parse standard Template markup")
|
922
|
-
end
|
923
|
-
|
924
|
-
def testIncludePath
|
925
|
-
incCommand = IncludeCommand.new("include.4.txt", [ "tdata" ])
|
926
|
-
text = File.open("tdata/include.4.out.txt").read()
|
927
|
-
assert_equal(text, incCommand.output,
|
928
|
-
"IncludeCommand accepts an array of paths as a second arg")
|
929
|
-
|
930
|
-
incCommand = IncludeCommand.new("include.4.txt", [ "/etc", "tdata" ])
|
931
|
-
text = File.open("tdata/include.4.out.txt").read()
|
932
|
-
assert_equal(text, incCommand.output,
|
933
|
-
"IncludeCommand accepts an array of paths as a second arg")
|
934
|
-
|
935
|
-
pt = PageTemplate.new('include_path' => "tdata")
|
936
|
-
pt.load("tdata/include.4b.txt")
|
937
|
-
pt["file"] = "include.4a.txt"
|
938
|
-
text = File.open("tdata/include.4.out.txt").read()
|
939
|
-
assert_equal(text, pt.output,
|
940
|
-
"Include Commands can be given a variable name as an argument")
|
941
|
-
|
942
|
-
pt = PageTemplate.new('include_path' => "tdata")
|
943
|
-
pt.load("tdata/include.4b.txt")
|
944
|
-
pt["file"] = "secret-of-life.txt"
|
945
|
-
text = File.open("tdata/include.4.nf.out.txt").read()
|
946
|
-
assert_equal(text, pt.output,
|
947
|
-
"Include Commands will output a warning if file isn't found.")
|
948
|
-
|
949
|
-
# Support for multiple include paths.
|
950
|
-
pt = PageTemplate.new()
|
951
|
-
assert_equal([ Dir.getwd() ], pt.path)
|
952
|
-
assert(pt.add_path('tdata'),
|
953
|
-
"Use #add_path(path) to add an include path.")
|
954
|
-
assert_equal([ Dir.getwd(), 'tdata'], pt.path)
|
955
|
-
pt.add_path('tdata/inc-1')
|
956
|
-
assert_equal([ Dir.getwd, "tdata", "tdata/inc-1"], pt.path)
|
957
|
-
pt = PageTemplate.new('include_path' => %w{tdata tdata/inc-1})
|
958
|
-
assert_equal([ Dir.getwd, "tdata", "tdata/inc-1"], pt.path)
|
959
|
-
end
|
960
|
-
|
961
|
-
def testIncludeSyntax
|
962
|
-
text = File.open("tdata/include.4.out.txt").read()
|
963
|
-
pt = PageTemplate.new("include_path" => "tdata")
|
964
|
-
pt.load("include.4.txt")
|
965
|
-
assert_equal(text, pt.output(),
|
966
|
-
"PageTemplate supports 'include' syntax")
|
967
|
-
pt = PageTemplate.new('include_path' => "tdata")
|
968
|
-
pt.load("include.5.txt")
|
969
|
-
assert_equal(text, pt.output(),
|
970
|
-
"PageTemplate supports 'include' syntax")
|
971
|
-
|
972
|
-
end
|
973
|
-
|
974
|
-
end
|