14199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa/* 24199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * Copyright (C) 2010 The Android Open Source Project 34199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * 44199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * Licensed under the Apache License, Version 2.0 (the "License"); 54199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * you may not use this file except in compliance with the License. 64199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * You may obtain a copy of the License at 74199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * 84199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * http://www.apache.org/licenses/LICENSE-2.0 94199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * 104199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * Unless required by applicable law or agreed to in writing, software 114199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * distributed under the License is distributed on an "AS IS" BASIS, 124199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 134199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * See the License for the specific language governing permissions and 144199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * limitations under the License. 154199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa */ 16677ef21613a9d35053ec098444832ce4125a847eDaisuke Miyakawapackage com.android.vcard.tests.testutils; 174199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 184199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport android.content.ContentValues; 195f363a8136349b242d243c3c0c14e6d5a065d23fDaisuke Miyakawaimport android.test.AndroidTestCase; 204199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 214199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport junit.framework.TestCase; 224199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 234199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport java.util.ArrayList; 244199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport java.util.Arrays; 254199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport java.util.HashMap; 264199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport java.util.HashSet; 274199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawaimport java.util.List; 284199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 294199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa/** 304199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * Utility class which verifies input VNode. 314199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * 324199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * This class first checks whether each propertyNode in the VNode is in the 334199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * "ordered expected property list". 344199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * If the node does not exist in the "ordered list", the class refers to 354199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa * "unorderd expected property set" and checks the node is expected somewhere. 364199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa */ 374199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawapublic class PropertyNodesVerifierElem { 384199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa public static class TypeSet extends HashSet<String> { 394199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa public TypeSet(String ... array) { 404199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa super(Arrays.asList(array)); 414199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 424199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 434199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 444199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa public static class GroupSet extends HashSet<String> { 454199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa public GroupSet(String ... array) { 464199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa super(Arrays.asList(array)); 474199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 484199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 494199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 504199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa private final HashMap<String, List<PropertyNode>> mOrderedNodeMap; 514199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa // Intentionally use ArrayList instead of Set, assuming there may be more than one 524199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa // exactly same objects. 534199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa private final ArrayList<PropertyNode> mUnorderedNodeList; 544199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 555f363a8136349b242d243c3c0c14e6d5a065d23fDaisuke Miyakawa public PropertyNodesVerifierElem(AndroidTestCase androidTestCase) { 564199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa mOrderedNodeMap = new HashMap<String, List<PropertyNode>>(); 574199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa mUnorderedNodeList = new ArrayList<PropertyNode>(); 584199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 594199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 604199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa // WithOrder 614199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 624199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa public PropertyNodesVerifierElem addExpectedNodeWithOrder(String propName, String propValue) { 634199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa return addExpectedNodeWithOrder(propName, propValue, null, null, null, null, null); 644199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 654199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 664199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa public PropertyNodesVerifierElem addExpectedNodeWithOrder( 674199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa String propName, String propValue, ContentValues contentValues) { 684199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa return addExpectedNodeWithOrder(propName, propValue, null, 694199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa null, contentValues, null, null); 704199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 714199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 724199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa public PropertyNodesVerifierElem addExpectedNodeWithOrder( 734199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa String propName, List<String> propValueList, ContentValues contentValues) { 744199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa return addExpectedNodeWithOrder(propName, null, propValueList, 754199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa null, contentValues, null, null); 764199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 774199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 784199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa public PropertyNodesVerifierElem addExpectedNodeWithOrder( 794199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa String propName, String propValue, List<String> propValueList) { 804199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa return addExpectedNodeWithOrder(propName, propValue, propValueList, null, 814199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa null, null, null); 824199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 834199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 844199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa public PropertyNodesVerifierElem addExpectedNodeWithOrder( 854199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa String propName, List<String> propValueList) { 864199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa final String propValue = concatinateListWithSemiColon(propValueList); 874199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa return addExpectedNodeWithOrder(propName, propValue.toString(), propValueList, 884199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa null, null, null, null); 894199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 904199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 914199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa public PropertyNodesVerifierElem addExpectedNodeWithOrder(String propName, String propValue, 924199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa TypeSet paramMap_TYPE) { 934199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa return addExpectedNodeWithOrder(propName, propValue, null, 944199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa null, null, paramMap_TYPE, null); 954199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 964199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 974199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa public PropertyNodesVerifierElem addExpectedNodeWithOrder(String propName, 984199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa List<String> propValueList, TypeSet paramMap_TYPE) { 994199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa return addExpectedNodeWithOrder(propName, null, propValueList, null, null, 1004199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa paramMap_TYPE, null); 1014199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 1024199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 1034560bdde6dd75cca49fc55b58aafb5d416b88ca3Daisuke Miyakawa public PropertyNodesVerifierElem addExpectedNodeWithOrder(String propName, 1044560bdde6dd75cca49fc55b58aafb5d416b88ca3Daisuke Miyakawa List<String> propValueList, ContentValues paramMap, TypeSet paramMap_TYPE) { 1054560bdde6dd75cca49fc55b58aafb5d416b88ca3Daisuke Miyakawa return addExpectedNodeWithOrder(propName, null, propValueList, null, paramMap, 1064560bdde6dd75cca49fc55b58aafb5d416b88ca3Daisuke Miyakawa paramMap_TYPE, null); 1074560bdde6dd75cca49fc55b58aafb5d416b88ca3Daisuke Miyakawa } 1084560bdde6dd75cca49fc55b58aafb5d416b88ca3Daisuke Miyakawa 1094199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa public PropertyNodesVerifierElem addExpectedNodeWithOrder(String propName, String propValue, 1104199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa ContentValues paramMap, TypeSet paramMap_TYPE) { 1114199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa return addExpectedNodeWithOrder(propName, propValue, null, null, 1124199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa paramMap, paramMap_TYPE, null); 1134199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 1144199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 1154199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa public PropertyNodesVerifierElem addExpectedNodeWithOrder(String propName, String propValue, 1164199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa List<String> propValueList, TypeSet paramMap_TYPE) { 1174199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa return addExpectedNodeWithOrder(propName, propValue, propValueList, null, null, 1184199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa paramMap_TYPE, null); 1194199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 1204199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 1214199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa public PropertyNodesVerifierElem addExpectedNodeWithOrder(String propName, String propValue, 1223d77102a83d0e412046ca0ff9dfdef1a44050ca3Daisuke Miyakawa List<String> propValueList, ContentValues paramMap) { 1233d77102a83d0e412046ca0ff9dfdef1a44050ca3Daisuke Miyakawa return addExpectedNodeWithOrder(propName, propValue, propValueList, null, paramMap, 1243d77102a83d0e412046ca0ff9dfdef1a44050ca3Daisuke Miyakawa null, null); 1253d77102a83d0e412046ca0ff9dfdef1a44050ca3Daisuke Miyakawa } 1263d77102a83d0e412046ca0ff9dfdef1a44050ca3Daisuke Miyakawa 1273d77102a83d0e412046ca0ff9dfdef1a44050ca3Daisuke Miyakawa public PropertyNodesVerifierElem addExpectedNodeWithOrder(String propName, String propValue, 1284199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa List<String> propValueList, byte[] propValue_bytes, 1294199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa ContentValues paramMap, TypeSet paramMap_TYPE, GroupSet propGroupSet) { 1304199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa if (propValue == null && propValueList != null) { 1314199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa propValue = concatinateListWithSemiColon(propValueList); 1324199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 133a76f41e328f31c2e9e9006160d8f65fe651eeb6aDaisuke Miyakawa final PropertyNode propertyNode = new PropertyNode(propName, 1344199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa propValue, propValueList, propValue_bytes, 1354199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa paramMap, paramMap_TYPE, propGroupSet); 1364199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa List<PropertyNode> expectedNodeList = mOrderedNodeMap.get(propName); 1374199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa if (expectedNodeList == null) { 1384199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa expectedNodeList = new ArrayList<PropertyNode>(); 1394199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa mOrderedNodeMap.put(propName, expectedNodeList); 1404199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 1414199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa expectedNodeList.add(propertyNode); 1424199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa return this; 1434199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 1444199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 1454199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa // WithoutOrder 1464199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 1474199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa public PropertyNodesVerifierElem addExpectedNode(String propName, String propValue) { 1484199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa return addExpectedNode(propName, propValue, null, null, null, null, null); 1494199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 1504199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 1514199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa public PropertyNodesVerifierElem addExpectedNode(String propName, String propValue, 1524199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa ContentValues contentValues) { 1534199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa return addExpectedNode(propName, propValue, null, null, contentValues, null, null); 1544199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 1554199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 1564199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa public PropertyNodesVerifierElem addExpectedNode(String propName, 1574199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa List<String> propValueList, ContentValues contentValues) { 1584199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa return addExpectedNode(propName, null, 1594199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa propValueList, null, contentValues, null, null); 1604199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 1614199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 1624199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa public PropertyNodesVerifierElem addExpectedNode(String propName, String propValue, 1634199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa List<String> propValueList) { 1644199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa return addExpectedNode(propName, propValue, propValueList, null, null, null, null); 1654199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 1664199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 1674199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa public PropertyNodesVerifierElem addExpectedNode(String propName, 1684199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa List<String> propValueList) { 1694199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa return addExpectedNode(propName, null, propValueList, 1704199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa null, null, null, null); 1714199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 1724199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 1734199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa public PropertyNodesVerifierElem addExpectedNode(String propName, String propValue, 1744199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa TypeSet paramMap_TYPE) { 1754199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa return addExpectedNode(propName, propValue, null, null, null, paramMap_TYPE, null); 1764199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 1774199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 1784199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa public PropertyNodesVerifierElem addExpectedNode(String propName, 1794199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa List<String> propValueList, TypeSet paramMap_TYPE) { 1804199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa final String propValue = concatinateListWithSemiColon(propValueList); 1814199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa return addExpectedNode(propName, propValue, propValueList, null, null, 1824199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa paramMap_TYPE, null); 1834199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 1844199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 1854199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa public PropertyNodesVerifierElem addExpectedNode(String propName, String propValue, 1864199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa List<String> propValueList, TypeSet paramMap_TYPE) { 1874199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa return addExpectedNode(propName, propValue, propValueList, null, null, 1884199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa paramMap_TYPE, null); 1894199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 1904199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 1914199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa public PropertyNodesVerifierElem addExpectedNode(String propName, String propValue, 1924199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa ContentValues paramMap, TypeSet paramMap_TYPE) { 1934199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa return addExpectedNode(propName, propValue, null, null, 1944199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa paramMap, paramMap_TYPE, null); 1954199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 1964199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 1974199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa public PropertyNodesVerifierElem addExpectedNode(String propName, String propValue, 1984199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa List<String> propValueList, byte[] propValue_bytes, 1994199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa ContentValues paramMap, TypeSet paramMap_TYPE, GroupSet propGroupSet) { 2004199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa if (propValue == null && propValueList != null) { 2014199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa propValue = concatinateListWithSemiColon(propValueList); 2024199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 2034199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa mUnorderedNodeList.add(new PropertyNode(propName, propValue, 2044199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa propValueList, propValue_bytes, paramMap, paramMap_TYPE, propGroupSet)); 2054199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa return this; 2064199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 2074199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 2084199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa public void verify(VNode vnode) { 2094199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa for (PropertyNode actualNode : vnode.propList) { 2104199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa verifyNode(actualNode.propName, actualNode); 2114199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 212a76f41e328f31c2e9e9006160d8f65fe651eeb6aDaisuke Miyakawa 2134199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa if (!mOrderedNodeMap.isEmpty() || !mUnorderedNodeList.isEmpty()) { 214a76f41e328f31c2e9e9006160d8f65fe651eeb6aDaisuke Miyakawa final List<String> expectedProps = new ArrayList<String>(); 2154199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa for (List<PropertyNode> nodes : mOrderedNodeMap.values()) { 2164199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa for (PropertyNode node : nodes) { 2174199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa if (!expectedProps.contains(node.propName)) { 2184199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa expectedProps.add(node.propName); 2194199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 2204199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 2214199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 2224199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa for (PropertyNode node : mUnorderedNodeList) { 2234199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa if (!expectedProps.contains(node.propName)) { 2244199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa expectedProps.add(node.propName); 2254199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 2264199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 2275f363a8136349b242d243c3c0c14e6d5a065d23fDaisuke Miyakawa TestCase.fail("Expected property " + Arrays.toString(expectedProps.toArray()) 2284199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa + " was not found."); 2294199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 2304199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 2314199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 2324199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa private void verifyNode(final String propName, final PropertyNode actualNode) { 233a76f41e328f31c2e9e9006160d8f65fe651eeb6aDaisuke Miyakawa final List<PropertyNode> expectedNodeList = mOrderedNodeMap.get(propName); 2344199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa final int size = (expectedNodeList != null ? expectedNodeList.size() : 0); 2354199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa if (size > 0) { 2364199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa for (int i = 0; i < size; i++) { 237a76f41e328f31c2e9e9006160d8f65fe651eeb6aDaisuke Miyakawa final PropertyNode expectedNode = expectedNodeList.get(i); 238a76f41e328f31c2e9e9006160d8f65fe651eeb6aDaisuke Miyakawa final List<PropertyNode> expectedButDifferentValueList = 239a76f41e328f31c2e9e9006160d8f65fe651eeb6aDaisuke Miyakawa new ArrayList<PropertyNode>(); 2404199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa if (expectedNode.propName.equals(propName)) { 2414199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa if (expectedNode.equals(actualNode)) { 2424199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa expectedNodeList.remove(i); 2434199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa if (expectedNodeList.size() == 0) { 2444199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa mOrderedNodeMap.remove(propName); 2454199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 2464199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa return; 2474199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } else { 2484199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa expectedButDifferentValueList.add(expectedNode); 2494199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 2504199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 2514199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 2524199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa // "actualNode" is not in ordered expected list. 2534199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa // Try looking over unordered expected list. 2544199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa if (tryFoundExpectedNodeFromUnorderedList(actualNode, 2554199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa expectedButDifferentValueList)) { 2564199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa return; 2574199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 2584199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 2594199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa if (!expectedButDifferentValueList.isEmpty()) { 2604199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa // Same propName exists but with different value(s). 2614199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa failWithExpectedNodeList(propName, actualNode, 2624199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa expectedButDifferentValueList); 2634199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } else { 2644199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa // There's no expected node with same propName. 2655f363a8136349b242d243c3c0c14e6d5a065d23fDaisuke Miyakawa TestCase.fail("Unexpected property \"" + propName + "\" exists."); 2664199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 2674199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 2684199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } else { 2694199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa List<PropertyNode> expectedButDifferentValueList = 2704199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa new ArrayList<PropertyNode>(); 2714199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa if (tryFoundExpectedNodeFromUnorderedList(actualNode, expectedButDifferentValueList)) { 2724199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa return; 2734199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } else { 2744199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa if (!expectedButDifferentValueList.isEmpty()) { 2754199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa // Same propName exists but with different value(s). 2764199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa failWithExpectedNodeList(propName, actualNode, 2774199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa expectedButDifferentValueList); 2784199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } else { 2794199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa // There's no expected node with same propName. 2805f363a8136349b242d243c3c0c14e6d5a065d23fDaisuke Miyakawa TestCase.fail("Unexpected property \"" + propName + "\" exists."); 2814199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 2824199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 2834199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 2844199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 2854199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 2864199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa private String concatinateListWithSemiColon(List<String> array) { 2874199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa StringBuffer buffer = new StringBuffer(); 2884199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa boolean first = true; 2894199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa for (String propValueElem : array) { 2904199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa if (first) { 2914199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa first = false; 2924199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } else { 2934199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa buffer.append(';'); 2944199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 2954199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa buffer.append(propValueElem); 2964199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 2974199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 2984199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa return buffer.toString(); 2994199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 3004199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 3014199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa private boolean tryFoundExpectedNodeFromUnorderedList(PropertyNode actualNode, 3024199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa List<PropertyNode> expectedButDifferentValueList) { 3034199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa final String propName = actualNode.propName; 3044199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa int unorderedListSize = mUnorderedNodeList.size(); 3054199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa for (int i = 0; i < unorderedListSize; i++) { 3064199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa PropertyNode unorderedExpectedNode = mUnorderedNodeList.get(i); 3074199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa if (unorderedExpectedNode.propName.equals(propName)) { 3084199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa if (unorderedExpectedNode.equals(actualNode)) { 3094199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa mUnorderedNodeList.remove(i); 3104199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa return true; 3114199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 3124199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa expectedButDifferentValueList.add(unorderedExpectedNode); 3134199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 3144199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 3154199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa return false; 3164199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 3174199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa 3184199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa private void failWithExpectedNodeList(String propName, PropertyNode actualNode, 3194199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa List<PropertyNode> expectedNodeList) { 3204199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa StringBuilder builder = new StringBuilder(); 3214199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa for (PropertyNode expectedNode : expectedNodeList) { 3224199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa builder.append("expected: "); 3234199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa builder.append(expectedNode.toString()); 3244199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa builder.append("\n"); 3254199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 3265f363a8136349b242d243c3c0c14e6d5a065d23fDaisuke Miyakawa TestCase.fail("Property \"" + propName + "\" has wrong value.\n" 3274199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa + builder.toString() 3284199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa + " actual: " + actualNode.toString()); 3294199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa } 3304199c54c527330ac01699b176e7bca186a3aa3a4Daisuke Miyakawa} 331