1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */
3 /* This Source Code Form is subject to the terms of the Mozilla Public
4  * License, v. 2.0. If a copy of the MPL was not distributed with this
5  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6 
7 #include "gtest/gtest.h"
8 
9 #include "gfxSkipChars.h"
10 #include "mozilla/ArrayUtils.h"
11 
TestConstructor()12 static bool TestConstructor() {
13   gfxSkipChars skipChars;
14 
15   EXPECT_TRUE(skipChars.GetOriginalCharCount() == 0)
16       << "[1] Make sure the gfxSkipChars was properly initialized with "
17          "constructor";
18 
19   return true;
20 }
21 
TestLength()22 static bool TestLength() {
23   gfxSkipChars skipChars;
24 
25   skipChars.KeepChars(100);
26 
27   EXPECT_TRUE(skipChars.GetOriginalCharCount() == 100)
28       << "[1] Check length after keeping chars";
29 
30   skipChars.SkipChars(50);
31 
32   EXPECT_TRUE(skipChars.GetOriginalCharCount() == 150)
33       << "[2] Check length after skipping chars";
34 
35   skipChars.SkipChars(50);
36 
37   EXPECT_TRUE(skipChars.GetOriginalCharCount() == 200)
38       << "[3] Check length after skipping more chars";
39 
40   skipChars.KeepChar();
41 
42   EXPECT_TRUE(skipChars.GetOriginalCharCount() == 201)
43       << "[4] Check length after keeping a final char";
44 
45   return true;
46 }
47 
TestIterator()48 static bool TestIterator() {
49   // Test a gfxSkipChars that starts with kept chars
50   gfxSkipChars skipChars1;
51 
52   skipChars1.KeepChars(9);
53   skipChars1.SkipChar();
54   skipChars1.KeepChars(9);
55   skipChars1.SkipChar();
56   skipChars1.KeepChars(9);
57 
58   EXPECT_TRUE(skipChars1.GetOriginalCharCount() == 29) << "[1] Check length";
59 
60   gfxSkipCharsIterator iter1(skipChars1);
61 
62   EXPECT_TRUE(iter1.GetOriginalOffset() == 0)
63       << "[2] Check initial original offset";
64   EXPECT_TRUE(iter1.GetSkippedOffset() == 0)
65       << "[3] Check initial skipped offset";
66 
67   EXPECT_TRUE(iter1.IsOriginalCharSkipped() == false)
68       << "[3a] Check IsOriginalCharSkipped for initial position";
69 
70   uint32_t expectSkipped1[] = {0,  1,  2,  3,  4,  5,  6,  7,  8,  9,
71                                9,  10, 11, 12, 13, 14, 15, 16, 17, 18,
72                                18, 19, 20, 21, 22, 23, 24, 25, 26, 27};
73 
74   for (uint32_t i = 0; i < mozilla::ArrayLength(expectSkipped1); i++) {
75     EXPECT_TRUE(iter1.ConvertOriginalToSkipped(i) == expectSkipped1[i])
76         << "[4] Check mapping of original to skipped for " << i;
77   }
78 
79   int32_t expectOriginal1[] = {0,  1,  2,  3,  4,  5,  6,  7,  8,
80                                10, 11, 12, 13, 14, 15, 16, 17, 18,
81                                20, 21, 22, 23, 24, 25, 26, 27, 28};
82 
83   for (uint32_t i = 0; i < mozilla::ArrayLength(expectOriginal1); i++) {
84     EXPECT_TRUE(iter1.ConvertSkippedToOriginal(i) == expectOriginal1[i])
85         << "[5] Check mapping of skipped to original for " << i;
86   }
87 
88   bool expectIsOriginalSkipped1[] = {
89       false, false, false, false, false, false, false, false, false, true,
90       false, false, false, false, false, false, false, false, false, true,
91       false, false, false, false, false, false, false, false, false};
92 
93   for (uint32_t i = 0; i < mozilla::ArrayLength(expectIsOriginalSkipped1);
94        i++) {
95     iter1.SetOriginalOffset(i);
96     EXPECT_TRUE(iter1.IsOriginalCharSkipped() == expectIsOriginalSkipped1[i])
97         << "[5.a] Check IsOriginalCharSkipped for " << i;
98   }
99 
100   // Test a gfxSkipChars that starts with skipped chars
101   gfxSkipChars skipChars2;
102 
103   skipChars2.SkipChars(9);
104   skipChars2.KeepChar();
105   skipChars2.SkipChars(9);
106   skipChars2.KeepChar();
107   skipChars2.SkipChars(9);
108 
109   EXPECT_TRUE(skipChars2.GetOriginalCharCount() == 29) << "[6] Check length";
110 
111   gfxSkipCharsIterator iter2(skipChars2);
112 
113   EXPECT_TRUE(iter2.GetOriginalOffset() == 0)
114       << "[7] Check initial original offset";
115   EXPECT_TRUE(iter2.GetSkippedOffset() == 0)
116       << "[8] Check initial skipped offset";
117 
118   EXPECT_TRUE(iter2.IsOriginalCharSkipped() == true)
119       << "[8a] Check IsOriginalCharSkipped for initial position";
120 
121   uint32_t expectSkipped2[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1,
122                                1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2};
123 
124   for (uint32_t i = 0; i < mozilla::ArrayLength(expectSkipped2); i++) {
125     EXPECT_TRUE(iter2.ConvertOriginalToSkipped(i) == expectSkipped2[i])
126         << "[9] Check mapping of original to skipped for " << i;
127   }
128 
129   int32_t expectOriginal2[] = {9, 19, 29};
130 
131   for (uint32_t i = 0; i < mozilla::ArrayLength(expectOriginal2); i++) {
132     EXPECT_TRUE(iter2.ConvertSkippedToOriginal(i) == expectOriginal2[i])
133         << "[10] Check mapping of skipped to original for " << i;
134   }
135 
136   bool expectIsOriginalSkipped2[] = {
137       true, true, true, true, true, true, true, true, true, false,
138       true, true, true, true, true, true, true, true, true, false,
139       true, true, true, true, true, true, true, true, true};
140 
141   for (uint32_t i = 0; i < mozilla::ArrayLength(expectIsOriginalSkipped2);
142        i++) {
143     iter2.SetOriginalOffset(i);
144     EXPECT_TRUE(iter2.IsOriginalCharSkipped() == expectIsOriginalSkipped2[i])
145         << "[10.a] Check IsOriginalCharSkipped for " << i;
146   }
147 
148   return true;
149 }
150 
TEST(Gfx,gfxSkipChars)151 TEST(Gfx, gfxSkipChars)
152 {
153   TestConstructor();
154   TestLength();
155   TestIterator();
156 }
157