1f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski/*
2f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski * Copyright (C) 2014 The Android Open Source Project
3f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski *
4f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski * Licensed under the Apache License, Version 2.0 (the "License");
5f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski * you may not use this file except in compliance with the License.
6f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski * You may obtain a copy of the License at
7f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski *
8f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski *      http://www.apache.org/licenses/LICENSE-2.0
9f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski *
10f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski * Unless required by applicable law or agreed to in writing, software
11f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski * distributed under the License is distributed on an "AS IS" BASIS,
12f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski * See the License for the specific language governing permissions and
14f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski * limitations under the License.
15f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski */
16f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski
17f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski#include <androidfw/ResourceTypes.h>
18f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski#include <androidfw/TypeWrappers.h>
19f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski#include <utils/String8.h>
20f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski
21f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski#include <gtest/gtest.h>
22f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski
23f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinskinamespace android {
24f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski
25f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinskivoid* createTypeData() {
26f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski    ResTable_type t;
27f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski    memset(&t, 0, sizeof(t));
28f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski    t.header.type = RES_TABLE_TYPE_TYPE;
29f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski    t.header.headerSize = sizeof(t);
30f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski    t.id = 1;
31f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski    t.entryCount = 3;
32f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski
33f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski    uint32_t offsets[3];
34f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski    t.entriesStart = t.header.headerSize + sizeof(offsets);
35f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski    t.header.size = t.entriesStart;
36f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski
37f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski    offsets[0] = 0;
38f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski    ResTable_entry e1;
39f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski    memset(&e1, 0, sizeof(e1));
40f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski    e1.size = sizeof(e1);
41f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski    e1.key.index = 0;
42f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski    t.header.size += sizeof(e1);
43f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski
44f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski    Res_value v1;
45f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski    memset(&v1, 0, sizeof(v1));
46f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski    t.header.size += sizeof(v1);
47f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski
48f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski    offsets[1] = ResTable_type::NO_ENTRY;
49f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski
50f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski    offsets[2] = sizeof(e1) + sizeof(v1);
51f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski    ResTable_entry e2;
52f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski    memset(&e2, 0, sizeof(e2));
53f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski    e2.size = sizeof(e2);
54f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski    e2.key.index = 1;
55f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski    t.header.size += sizeof(e2);
56f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski
57f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski    Res_value v2;
58f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski    memset(&v2, 0, sizeof(v2));
59f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski    t.header.size += sizeof(v2);
60f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski
61f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski    uint8_t* data = (uint8_t*)malloc(t.header.size);
62f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski    uint8_t* p = data;
63f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski    memcpy(p, &t, sizeof(t));
64f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski    p += sizeof(t);
65f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski    memcpy(p, offsets, sizeof(offsets));
66f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski    p += sizeof(offsets);
67f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski    memcpy(p, &e1, sizeof(e1));
68f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski    p += sizeof(e1);
69f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski    memcpy(p, &v1, sizeof(v1));
70f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski    p += sizeof(v1);
71f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski    memcpy(p, &e2, sizeof(e2));
72f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski    p += sizeof(e2);
73f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski    memcpy(p, &v2, sizeof(v2));
74f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski    p += sizeof(v2);
75f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski    return data;
76f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski}
77f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski
78f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam LesinskiTEST(TypeVariantIteratorTest, shouldIterateOverTypeWithoutErrors) {
79f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski    ResTable_type* data = (ResTable_type*) createTypeData();
80f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski
81f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski    TypeVariant v(data);
82f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski
83f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski    TypeVariant::iterator iter = v.beginEntries();
84f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski    ASSERT_EQ(uint32_t(0), iter.index());
85f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski    ASSERT_TRUE(NULL != *iter);
86f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski    ASSERT_EQ(uint32_t(0), iter->key.index);
87f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski    ASSERT_NE(v.endEntries(), iter);
88f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski
89f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski    iter++;
90f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski
91f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski    ASSERT_EQ(uint32_t(1), iter.index());
92f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski    ASSERT_TRUE(NULL == *iter);
93f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski    ASSERT_NE(v.endEntries(), iter);
94f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski
95f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski    iter++;
96f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski
97f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski    ASSERT_EQ(uint32_t(2), iter.index());
98f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski    ASSERT_TRUE(NULL != *iter);
99f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski    ASSERT_EQ(uint32_t(1), iter->key.index);
100f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski    ASSERT_NE(v.endEntries(), iter);
101f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski
102f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski    iter++;
103f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski
104f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski    ASSERT_EQ(v.endEntries(), iter);
105f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski
106f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski    free(data);
107f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski}
108f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski
109f90f2f8dc36e7243b85e0b6a7fd5a590893c827eAdam Lesinski} // namespace android
110