1 | 'use strict';
|
2 |
|
3 | var Velocity = require('../src/velocity')
|
4 | var assert = require("assert")
|
5 | var render = Velocity.render;
|
6 |
|
7 | describe('Loops', function() {
|
8 |
|
9 | it('#foreach', function() {
|
10 | var vm = '#foreach( $product in $allProducts )<li>$product</li>#end'
|
11 | var data = {allProducts: ["book", "phone"]}
|
12 | assert.equal('<li>book</li><li>phone</li>', render(vm, data))
|
13 | })
|
14 |
|
15 | it('#foreach with map', function() {
|
16 | var vm = '#foreach($key in $products) name => $products.name #end'
|
17 | var data = {products: {name: "hanwen"}}
|
18 | assert.equal(' name => hanwen ', render(vm, data))
|
19 | })
|
20 |
|
21 | it('#foreach with map hasNext', function() {
|
22 | var vm = '#foreach($product in $products)$product.name#if($foreach.hasNext),#end#end'
|
23 | var data = {products: {product1: {name: "hanwen1"}, product2: {name: "hanwen2"}, product3: {name: "hanwen3"}}};
|
24 | assert.equal('hanwen1,hanwen2,hanwen3', render(vm, data))
|
25 | })
|
26 |
|
27 | it('#foreach with map keySet', function() {
|
28 | var vm = '#foreach($key in $products.keySet())' +
|
29 | ' $key => $products.get($key) #end'
|
30 | var data = {products: {name: "hanwen"}}
|
31 | assert.equal(' name => hanwen ', render(vm, data))
|
32 | })
|
33 |
|
34 | it('#foreach with nest foreach', function() {
|
35 | var vm = '#foreach($i in [1..2])${velocityCount}' +
|
36 | '#foreach($j in [2..3])${velocityCount}#end#end'
|
37 | assert.equal('112212', render(vm))
|
38 | var vm = '#foreach($i in [5..2])$i#end'
|
39 | assert.equal('5432', render(vm))
|
40 | })
|
41 |
|
42 | it('#foreach with nest non-empty foreach', function() {
|
43 | var vm = '#foreach($i in [1..2])' +
|
44 | '[#foreach($j in [1..2])$j#if($foreach.hasNext),#end#end]' +
|
45 | '#if($foreach.hasNext),#end#end'
|
46 | assert.equal('[1,2],[1,2]', render(vm))
|
47 | })
|
48 |
|
49 | it('#foreach with nest empty foreach', function() {
|
50 | var vm = '#foreach($i in [1..2])' +
|
51 | '[#foreach($j in [])$j#if($foreach.hasNext),#end#end]' +
|
52 | '#if($foreach.hasNext),#end#end'
|
53 | assert.equal('[],[]', render(vm))
|
54 | })
|
55 |
|
56 | it('#foreach with map entrySet', function() {
|
57 | var vm = '' +
|
58 | '#set($js_file = {\n' +
|
59 | ' "js_arale":"build/js/arale.js?t=20110608",\n' +
|
60 | ' "js_ma_template":"build/js/ma/template.js?t=20110608",\n' +
|
61 | ' "js_pa_pa":"build/js/pa/pa.js?t=20110608",\n' +
|
62 | ' "js_swiff":"build/js/app/swiff.js?t=20110608",\n' +
|
63 | ' "js_alieditControl":"build/js/pa/alieditcontrol-update.js?"\n' +
|
64 | '})\n' +
|
65 | '#foreach($_item in $js_file.entrySet())' +
|
66 | '$_item.key = $staticServer.getURI("/${_item.value}")\n' +
|
67 | '#end'
|
68 |
|
69 | var ret = 'js_arale = /path/build/js/arale.js?t=20110608\n' +
|
70 | 'js_ma_template = /path/build/js/ma/template.js?t=20110608\n' +
|
71 | 'js_pa_pa = /path/build/js/pa/pa.js?t=20110608\n' +
|
72 | 'js_swiff = /path/build/js/app/swiff.js?t=20110608\n' +
|
73 | 'js_alieditControl = /path/build/js/pa/alieditcontrol-update.js?\n'
|
74 |
|
75 | var data = {
|
76 | staticServer: {
|
77 | getURI: function(url) {
|
78 | return '/path' + url
|
79 | }
|
80 | }
|
81 | }
|
82 |
|
83 | assert.equal(ret.trim(), render(vm, data).trim())
|
84 |
|
85 | })
|
86 |
|
87 | it('#foreach with #macro, $velocityCount should work, #25', function() {
|
88 | var vm = '#macro(local) #end ' +
|
89 | '#foreach ($one in [1,2,4]) #local() $velocityCount #end'
|
90 | var ret = render(vm).replace(/\s+/g, '')
|
91 | assert.equal('123', ret)
|
92 | })
|
93 |
|
94 | it('#break', function() {
|
95 | var vm = '#foreach($num in [1..6])' +
|
96 | ' #if($foreach.count > 3) #break #end $num #end'
|
97 | assert.equal(' 1 2 3 4 ', render(vm))
|
98 | })
|
99 |
|
100 | it('#break for map', function() {
|
101 | var vm = '#foreach($item in $map)' +
|
102 | ' #if($foreach.count > 2) #break #end $item #end'
|
103 | var data = {map: {item1: '1', item2: '2', item3: '3', item4: '4'}}
|
104 | assert.equal(' 1 2 3 ', render(vm, data))
|
105 | })
|
106 |
|
107 | it('foreach for null', function() {
|
108 | var vm = '#foreach($num in $bar) #end';
|
109 | assert.equal('', render(vm))
|
110 | })
|
111 |
|
112 | it('support #foreach(${itemData} in ${defaultData})', function() {
|
113 | const vm = `#set($allProducts = [1, 2, 3])
|
114 | #foreach(\${product} in \${allProducts}) <li>$product</li> #end`;
|
115 | const html = render(vm)
|
116 | html.should.containEql('<li>1</li>');
|
117 | html.should.containEql('<li>2</li>');
|
118 | });
|
119 |
|
120 | it('issue 100', function() {
|
121 | const vm = `
|
122 | #set($records = [[1], [2], [3]])
|
123 | #foreach($rec in $records)
|
124 | #set($match = true)
|
125 | #foreach($val in $rec)
|
126 | #if($val % 2 != 0)
|
127 | #set($match = false)
|
128 | #break
|
129 | #end
|
130 | #end
|
131 | #if($match == true)
|
132 | matched: "$rec"
|
133 | #end
|
134 | #end
|
135 | `;
|
136 | const context = {
|
137 | records: [[1], [2], [3]]
|
138 | };
|
139 | const ret = render(vm, context);
|
140 | ret.replace(/\s+/g, '').should.equal('matched:"[2]"');
|
141 | });
|
142 |
|
143 | it('set ok, fix #129', () => {
|
144 | const context = {
|
145 | records: [{ ID: '1' }, { ID: '2' }, { ID: '3' }],
|
146 | };
|
147 |
|
148 | const template1 = `
|
149 | #foreach($item in $records)
|
150 | #set( $item.key = $item.ID )
|
151 | #end
|
152 | $records`;
|
153 | const template2 = `
|
154 | #foreach($x in $records)
|
155 | #set( $item = $x )
|
156 | #set( $item.key = $item.ID )
|
157 | #end
|
158 | $records`;
|
159 |
|
160 | const ret = render(template1, context);
|
161 | ret.trim().should.equal('[{ID=1, key=1}, {ID=2, key=2}, {ID=3, key=3}]');
|
162 | const ret2 = render(template2, context);
|
163 | ret2.trim().should.equal('[{ID=1, key=1}, {ID=2, key=2}, {ID=3, key=3}]');
|
164 | });
|
165 | })
|