Skip to content

Commit

Permalink
Merge pull request #56 from ToQoz/tostring
Browse files Browse the repository at this point in the history
proposal: toString like org.apache.velocity when render
  • Loading branch information
shepherdwind committed Dec 10, 2015
2 parents 5b68459 + 499eb0b commit 06349db
Show file tree
Hide file tree
Showing 2 changed files with 73 additions and 1 deletion.
18 changes: 17 additions & 1 deletion src/compile/compile.js
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ module.exports = function(Velocity, utils) {

switch (ast.type) {
case 'references':
str += this.getReferences(ast, true);
str += this.format(this.getReferences(ast, true));
break;

case 'set':
Expand Down Expand Up @@ -106,6 +106,22 @@ module.exports = function(Velocity, utils) {
}, this);

return str;
},
format: function(value) {
if (utils.isArray(value)) {
return "[" + value.map(this.format.bind(this)).join(", ") + "]";
}

if (utils.isObject(value)) {
if (value.hasOwnProperty('toString')) {
return value.toString();
}

var kvJoin = function(k) { return k + "=" + this.format(value[k]); }.bind(this);
return "{" + Object.keys(value).map(kvJoin).join(", ") + "}";
}

return value;
}
});
};
56 changes: 56 additions & 0 deletions tests/compile.js
Original file line number Diff line number Diff line change
Expand Up @@ -824,5 +824,61 @@ describe('Compile', function() {
}));
});
});

describe('Object|Array#toString', function() {
it('simple object', function() {
var vm = '$data';
var expected = '{k=v, k2=v2}';
assert.equal(render(vm, {data: {k: "v", k2: "v2"}}), expected)
});

it('object.keySet()', function() {
var vm = '$data.keySet()';
var expected = '[k, k2]';
assert.equal(render(vm, {data: {k: "v", k2: "v2"}}), expected)
});

it('object.entrySet()', function() {
var vm = '$data.entrySet()';
var expected = '[{key=k, value=v}, {key=k2, value=v2}]';
assert.equal(render(vm, {data: {k: "v", k2: "v2"}}), expected)
});

it('nested object', function() {
var vm = '$data';
var expected = '{k={k2=v2}, kk={k3=v3}}';
assert.equal(render(vm, {data: {k: {k2: "v2"}, kk: {k3: "v3"}}}), expected)
});

it('object that has toString as own property', function() {
var vm = '$data';
var expected = 'custom';
assert.equal(render(vm, {data: {toString: function() { return 'custom'; }, key: "value", key2: "value2", key3: {key4: "value4"}}}), expected)
});

it('simple array', function() {
var vm = '$data';
var expected = '[a, b]';
assert.equal(render(vm, {data: ["a", "b"]}), expected)
});

it('nested array', function() {
var vm = '$data';
var expected = '[a, [b]]';
assert.equal(render(vm, {data: ["a", ["b"]]}), expected)
});

it('object in array', function() {
var vm = '$data';
var expected = '[a, {k=v}]';
assert.equal(render(vm, {data: ["a", {k: "v"}]}), expected)
});

it('array in object', function() {
var vm = '$data';
var expected = '{k=[a, b]}';
assert.equal(render(vm, {data: {k: ["a", "b"]}}), expected)
});
});
})

0 comments on commit 06349db

Please sign in to comment.