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