// Copyright 2006 The Closure Library Authors. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS-IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. goog.provide('goog.ds.FastDataNodeTest'); goog.setTestOnly('goog.ds.FastDataNodeTest'); goog.require('goog.array'); goog.require('goog.ds.DataManager'); goog.require('goog.ds.Expr'); goog.require('goog.ds.FastDataNode'); goog.require('goog.testing.jsunit'); var simpleObject; var complexObject; var dataChangeEvents; function setUp() { simpleObject = {Name: 'Jon Doe', Email: 'jon.doe@gmail.com'}; complexObject = { Name: 'Jon Doe', Email: 'jon.doe@gmail.com', Emails: [ {Address: 'jon.doe@gmail.com', Type: 'Home'}, {Address: 'jon.doe@workplace.com', Type: 'Work'} ], GroupIds: [23, 42] }; var dm = goog.ds.DataManager.getInstance(); dataChangeEvents = []; dm.fireDataChange = function(dataPath) { dataChangeEvents.push(dataPath); }; } function tearDown() { goog.ds.DataManager.clearInstance(); } function testGetChildNodeValue() { var node = new goog.ds.FastDataNode(simpleObject, 'Simple'); var value = node.getChildNodeValue('Name'); assert(goog.isString(value)); assertEquals('Jon Doe', value); } function testDataNameAndPath() { var node = new goog.ds.FastDataNode(simpleObject, 'Simple'); assertEquals('DataName should be \'Simple\'', 'Simple', node.getDataName()); assertEquals('DataPath should be \'Simple\'', 'Simple', node.getDataPath()); } function testStringChildNode() { var node = goog.ds.FastDataNode.fromJs(simpleObject, 'Simple'); var name = node.getChildNode('Name'); var email = node.getChildNode('Email'); assertEquals('Jon Doe', name.get()); assertEquals('jon.doe@gmail.com', email.get()); assertEquals('Name', name.getDataName()); assertEquals('Simple/Name', name.getDataPath()); assertEquals('Email', email.getDataName()); assertEquals('Simple/Email', email.getDataPath()); } function testGetChildNodes() { var node = goog.ds.FastDataNode.fromJs(simpleObject, 'Simple'); var children = node.getChildNodes(); assertEquals(2, children.getCount()); var childValues = []; for (var i = 0; i < 2; ++i) { childValues.push(children.getByIndex(i).get()); } goog.array.sort(childValues); assertEquals('Jon Doe', childValues[0]); assertEquals('jon.doe@gmail.com', childValues[1]); } function testGetDistinguishesBetweenOverloads() { var node = goog.ds.FastDataNode.fromJs(simpleObject, 'Simple'); assertEquals(node, node.get()); assertEquals('Jon Doe', node.getChildNodes().get('Name').get()); } function testGetChildNodesForPrimitiveNodes() { var node = goog.ds.FastDataNode.fromJs(simpleObject, 'Simple'); var children = node.getChildNode('Name').getChildNodes(); assertEquals(0, children.getCount()); } function testFastListNode() { var node = goog.ds.FastDataNode.fromJs(complexObject, 'Object'); assertEquals('Jon Doe', node.getChildNodeValue('Name')); var emails = node.getChildNode('Emails'); assertEquals( 'jon.doe@gmail.com', emails.getChildNode('[0]').getChildNodeValue('Address')); assertEquals( 'jon.doe@workplace.com', emails.getChildNode('[1]').getChildNodeValue('Address')); assertEquals( 'Object/Emails/[0]/Address', emails.getChildNode('[0]').getChildNode('Address').getDataPath()); var groups = node.getChildNode('GroupIds'); assertEquals(23, groups.getChildNode('[0]').get()); assertEquals(42, groups.getChildNodeValue('[1]')); var childValues = emails.getChildNodes(); assertEquals(2, childValues.getCount()); assertEquals( 'jon.doe@gmail.com', childValues.getByIndex(0).getChildNodeValue('Address')); } function testChildNodeValueForNonexistantAttribute() { var node = goog.ds.FastDataNode.fromJs(complexObject, 'Object'); assertNull(node.getChildNodeValue('DoesNotExist')); assertNull(node.getChildNode('Emails').getChildNodeValue('[666]')); } function testAllChildrenSelector() { var node = goog.ds.FastDataNode.fromJs(complexObject, 'Object'); var allChildren = node.getChildNodes('*'); assertEquals(4, allChildren.getCount()); // not implemented, yet // var nameChild = node.getChildNodes('Name'); // assertEquals(1, allChildren.getCount()); } function testExpression() { var node = goog.ds.FastDataNode.fromJs(complexObject, 'Object'); assertEquals('Jon Doe', goog.ds.Expr.create('Name').getValue(node)); assertEquals( 'jon.doe@workplace.com', goog.ds.Expr.create('Emails/[1]/Address').getNode(node).get()); var emails = goog.ds.Expr.create('Emails/*').getNodes(node); assertEquals(2, emails.getCount()); assertEquals( 'jon.doe@workplace.com', emails.getByIndex(1).getChildNodeValue('Address')); } function testModifyNode() { var node = goog.ds.FastDataNode.fromJs(complexObject, 'Object'); node.getChildNode('Name').set('Foo Bar'); assertEquals('Foo Bar', node.getChildNodeValue('Name')); } function testClone() { var node = goog.ds.FastDataNode.fromJs(complexObject, 'Object'); var clone = node.clone(); node.getChildNode('Name').set('Foo Bar'); assertEquals('Jon Doe', clone.getChildNodeValue('Name')); var expr = goog.ds.Expr.create('Emails/[1]/Address'); expr.getNode(clone).set('jon@doe.com'); assertEquals('jon.doe@workplace.com', expr.getValue(node)); assertEquals('jon@doe.com', expr.getValue(clone)); } function testSetChildNodeOnList() { var list = goog.ds.FastDataNode.fromJs([], 'list'); var node = goog.ds.FastDataNode.fromJs({Id: '42', Name: 'Foo'}, '42', list); list.setChildNode('42', node); assertEquals(node, list.getChildNode('42')); assertEquals(node, list.getChildNodes().getByIndex(0)); assertEquals(node, list.getChildNodes().get('42')); } function testCreateNewValueWithSetChildNode() { var node = goog.ds.FastDataNode.fromJs({}, 'object'); node.setChildNode('Foo', 'Bar'); assertEquals('Bar', node.getChildNodeValue('Foo')); } function testSetChildNotWithNull_object() { var node = new goog.ds.FastDataNode({Foo: 'Bar'}, 'test'); node.setChildNode('Foo', null); assertNull('node should not have a Foo child', node.getChildNode('Foo')); assertEquals( 'node should not have any children', 0, node.getChildNodes().getCount()); } function testSetChildNotWithNull_list() { var list = goog.ds.FastDataNode.fromJs([], 'list'); list.setChildNode('foo', 'bar'); list.setChildNode('gee', 'wizz'); assertEquals('bar', list.getChildNodeValue('foo')); assertEquals('wizz', list.getChildNodes().getByIndex(1).get()); list.setChildNode('foo', null); assertEquals(1, list.getChildNodes().getCount()); assertEquals('wizz', list.getChildNodeValue('gee')); assertEquals('wizz', list.getChildNodes().getByIndex(0).get()); } function testNodeListIndexesOnId() { var list = goog.ds.FastDataNode.fromJs([{id: '^Freq', value: 'foo'}], 'list'); assertEquals('foo', list.getChildNode('^Freq').getChildNodeValue('value')); list.setChildNode('^Temp', {id: '^Temp', value: 'bar'}); assertEquals('bar', list.getChildNode('^Temp').getChildNodeValue('value')); } function verifyDataChangeEvents(expected) { assertEquals(expected.length, dataChangeEvents.length); for (var i = 0; i < expected.length; ++i) { assertEquals(expected[i], dataChangeEvents[i]); } dataChangeEvents = []; } function testFireDataChangeOnSet() { var node = new goog.ds.FastDataNode(simpleObject, 'Simple'); node.getChildNode('Name').set('Foo Bar'); verifyDataChangeEvents(['Simple/Name']); } function testFireDataChangeOnSetChildNode_object() { var node = new goog.ds.FastDataNode(simpleObject, 'Simple'); node.setChildNode('Name', 'Foo Bar'); node.setChildNode('Email', null); verifyDataChangeEvents(['Simple/Name', 'Simple/Email']); } function testFireDataChangeOnSetChildNode_list() { var node = new goog.ds.FastDataNode(complexObject, 'Node'); node.getChildNode('GroupIds').setChildNode('[0]', 1001); verifyDataChangeEvents(['Node/GroupIds/[0]']); node.getChildNode('GroupIds').getChildNodes().add(1002); verifyDataChangeEvents( ['Node/GroupIds/[2]', 'Node/GroupIds', 'Node/GroupIds/count()']); node.getChildNode('GroupIds').setChildNode('foo', 1003); verifyDataChangeEvents( ['Node/GroupIds/foo', 'Node/GroupIds', 'Node/GroupIds/count()']); }