xref: /aosp_15_r20/external/zucchini/io_utils_unittest.cc (revision a03ca8b91e029cd15055c20c78c2e087c84792e4)
1*a03ca8b9SKrzysztof Kosiński // Copyright 2017 The Chromium Authors. All rights reserved.
2*a03ca8b9SKrzysztof Kosiński // Use of this source code is governed by a BSD-style license that can be
3*a03ca8b9SKrzysztof Kosiński // found in the LICENSE file.
4*a03ca8b9SKrzysztof Kosiński 
5*a03ca8b9SKrzysztof Kosiński #include "components/zucchini/io_utils.h"
6*a03ca8b9SKrzysztof Kosiński 
7*a03ca8b9SKrzysztof Kosiński #include <stdint.h>
8*a03ca8b9SKrzysztof Kosiński 
9*a03ca8b9SKrzysztof Kosiński #include <sstream>
10*a03ca8b9SKrzysztof Kosiński #include <string>
11*a03ca8b9SKrzysztof Kosiński 
12*a03ca8b9SKrzysztof Kosiński #include "testing/gtest/include/gtest/gtest.h"
13*a03ca8b9SKrzysztof Kosiński 
14*a03ca8b9SKrzysztof Kosiński namespace zucchini {
15*a03ca8b9SKrzysztof Kosiński 
TEST(IOUtilsTest,LimitedOutputStream)16*a03ca8b9SKrzysztof Kosiński TEST(IOUtilsTest, LimitedOutputStream) {
17*a03ca8b9SKrzysztof Kosiński   std::ostringstream oss;
18*a03ca8b9SKrzysztof Kosiński   LimitedOutputStream los(oss, 3);
19*a03ca8b9SKrzysztof Kosiński   EXPECT_FALSE(los.full());
20*a03ca8b9SKrzysztof Kosiński   EXPECT_EQ("", oss.str());
21*a03ca8b9SKrzysztof Kosiński   // Line 1.
22*a03ca8b9SKrzysztof Kosiński   los << "a" << 1 << "b" << 2 << "c" << 3 << std::endl;
23*a03ca8b9SKrzysztof Kosiński   EXPECT_FALSE(los.full());
24*a03ca8b9SKrzysztof Kosiński   EXPECT_EQ("a1b2c3\n", oss.str());
25*a03ca8b9SKrzysztof Kosiński   // Line 2.
26*a03ca8b9SKrzysztof Kosiński   oss.str("");
27*a03ca8b9SKrzysztof Kosiński   los << "\r\r\n\n" << std::endl;  // Manual new lines don't count.
28*a03ca8b9SKrzysztof Kosiński   EXPECT_FALSE(los.full());
29*a03ca8b9SKrzysztof Kosiński   EXPECT_EQ("\r\r\n\n\n", oss.str());
30*a03ca8b9SKrzysztof Kosiński   // Line 3.
31*a03ca8b9SKrzysztof Kosiński   oss.str("");
32*a03ca8b9SKrzysztof Kosiński   los << "blah" << 137;
33*a03ca8b9SKrzysztof Kosiński   EXPECT_FALSE(los.full());
34*a03ca8b9SKrzysztof Kosiński   los << std::endl;
35*a03ca8b9SKrzysztof Kosiński   EXPECT_TRUE(los.full());
36*a03ca8b9SKrzysztof Kosiński   EXPECT_EQ("blah137\n(Additional output suppressed)\n", oss.str());
37*a03ca8b9SKrzysztof Kosiński   // Not testing adding more lines: the behavior is undefined since we rely on
38*a03ca8b9SKrzysztof Kosiński   // caller suppressing output if |los.full()| is true.
39*a03ca8b9SKrzysztof Kosiński }
40*a03ca8b9SKrzysztof Kosiński 
TEST(IOUtilsTest,AsHex)41*a03ca8b9SKrzysztof Kosiński TEST(IOUtilsTest, AsHex) {
42*a03ca8b9SKrzysztof Kosiński   std::ostringstream oss;
43*a03ca8b9SKrzysztof Kosiński   // Helper for single-line tests. Eats dummy std::ostream& from operator<<().
44*a03ca8b9SKrzysztof Kosiński   auto extract = [&oss](std::ostream&) -> std::string {
45*a03ca8b9SKrzysztof Kosiński     std::string ret = oss.str();
46*a03ca8b9SKrzysztof Kosiński     oss.str("");
47*a03ca8b9SKrzysztof Kosiński     return ret;
48*a03ca8b9SKrzysztof Kosiński   };
49*a03ca8b9SKrzysztof Kosiński 
50*a03ca8b9SKrzysztof Kosiński   EXPECT_EQ("00000000", extract(oss << AsHex<8>(0)));
51*a03ca8b9SKrzysztof Kosiński   EXPECT_EQ("12345678", extract(oss << AsHex<8>(0x12345678U)));
52*a03ca8b9SKrzysztof Kosiński   EXPECT_EQ("9ABCDEF0", extract(oss << AsHex<8>(0x9ABCDEF0U)));
53*a03ca8b9SKrzysztof Kosiński   EXPECT_EQ("(00000064)", extract(oss << "(" << AsHex<8>(100) << ")"));
54*a03ca8b9SKrzysztof Kosiński   EXPECT_EQ("00FFFF", extract(oss << AsHex<6>(0xFFFFU)));
55*a03ca8b9SKrzysztof Kosiński   EXPECT_EQ("FFFF", extract(oss << AsHex<4>(0xFFFFU)));
56*a03ca8b9SKrzysztof Kosiński   EXPECT_EQ("...FF", extract(oss << AsHex<2>(0xFFFFU)));
57*a03ca8b9SKrzysztof Kosiński   EXPECT_EQ("...00", extract(oss << AsHex<2>(0x100U)));
58*a03ca8b9SKrzysztof Kosiński   EXPECT_EQ("FF\n", extract(oss << AsHex<2>(0xFFU) << std::endl));
59*a03ca8b9SKrzysztof Kosiński   EXPECT_EQ("132457689BACDEF0",
60*a03ca8b9SKrzysztof Kosiński             extract(oss << AsHex<16, uint64_t>(0x132457689BACDEF0LLU)));
61*a03ca8b9SKrzysztof Kosiński   EXPECT_EQ("000000000001", extract(oss << AsHex<12, uint8_t>(1)));
62*a03ca8b9SKrzysztof Kosiński   EXPECT_EQ("00000089", extract(oss << AsHex<8, int32_t>(137)));
63*a03ca8b9SKrzysztof Kosiński   EXPECT_EQ("...FFFFFFFF", extract(oss << AsHex<8, int32_t>(-1)));
64*a03ca8b9SKrzysztof Kosiński   EXPECT_EQ("7FFF", extract(oss << AsHex<4, int16_t>(0x7FFFU)));
65*a03ca8b9SKrzysztof Kosiński   EXPECT_EQ("...8000", extract(oss << AsHex<4, int16_t>(0x8000U)));
66*a03ca8b9SKrzysztof Kosiński   EXPECT_EQ("8000", extract(oss << AsHex<4, uint16_t>(0x8000U)));
67*a03ca8b9SKrzysztof Kosiński }
68*a03ca8b9SKrzysztof Kosiński 
TEST(IOUtilsTest,PrefixSep)69*a03ca8b9SKrzysztof Kosiński TEST(IOUtilsTest, PrefixSep) {
70*a03ca8b9SKrzysztof Kosiński   std::ostringstream oss;
71*a03ca8b9SKrzysztof Kosiński   PrefixSep sep(",");
72*a03ca8b9SKrzysztof Kosiński   oss << sep << 3;
73*a03ca8b9SKrzysztof Kosiński   EXPECT_EQ("3", oss.str());
74*a03ca8b9SKrzysztof Kosiński   oss << sep << 1;
75*a03ca8b9SKrzysztof Kosiński   EXPECT_EQ("3,1", oss.str());
76*a03ca8b9SKrzysztof Kosiński   oss << sep << 4 << sep << 1 << sep << "59";
77*a03ca8b9SKrzysztof Kosiński   EXPECT_EQ("3,1,4,1,59", oss.str());
78*a03ca8b9SKrzysztof Kosiński }
79*a03ca8b9SKrzysztof Kosiński 
TEST(IOUtilsTest,PrefixSepAlt)80*a03ca8b9SKrzysztof Kosiński TEST(IOUtilsTest, PrefixSepAlt) {
81*a03ca8b9SKrzysztof Kosiński   std::ostringstream oss;
82*a03ca8b9SKrzysztof Kosiński   PrefixSep sep("  ");
83*a03ca8b9SKrzysztof Kosiński   oss << sep << 3;
84*a03ca8b9SKrzysztof Kosiński   EXPECT_EQ("3", oss.str());
85*a03ca8b9SKrzysztof Kosiński   oss << sep << 1;
86*a03ca8b9SKrzysztof Kosiński   EXPECT_EQ("3  1", oss.str());
87*a03ca8b9SKrzysztof Kosiński   oss << sep << 4 << sep << 1 << sep << "59";
88*a03ca8b9SKrzysztof Kosiński   EXPECT_EQ("3  1  4  1  59", oss.str());
89*a03ca8b9SKrzysztof Kosiński }
90*a03ca8b9SKrzysztof Kosiński 
TEST(IOUtilsTest,EatChar)91*a03ca8b9SKrzysztof Kosiński TEST(IOUtilsTest, EatChar) {
92*a03ca8b9SKrzysztof Kosiński   std::istringstream main_iss;
93*a03ca8b9SKrzysztof Kosiński   // Helper for single-line tests.
94*a03ca8b9SKrzysztof Kosiński   auto iss = [&main_iss](const std::string s) -> std::istringstream& {
95*a03ca8b9SKrzysztof Kosiński     main_iss.clear();
96*a03ca8b9SKrzysztof Kosiński     main_iss.str(s);
97*a03ca8b9SKrzysztof Kosiński     return main_iss;
98*a03ca8b9SKrzysztof Kosiński   };
99*a03ca8b9SKrzysztof Kosiński 
100*a03ca8b9SKrzysztof Kosiński   EXPECT_TRUE(iss("a,1") >> EatChar('a') >> EatChar(',') >> EatChar('1'));
101*a03ca8b9SKrzysztof Kosiński   EXPECT_FALSE(iss("a,a") >> EatChar('a') >> EatChar(',') >> EatChar('1'));
102*a03ca8b9SKrzysztof Kosiński   EXPECT_FALSE(iss("a") >> EatChar('a') >> EatChar(',') >> EatChar('1'));
103*a03ca8b9SKrzysztof Kosiński   EXPECT_FALSE(iss("x") >> EatChar('X'));
104*a03ca8b9SKrzysztof Kosiński   EXPECT_TRUE(iss("_\n") >> EatChar('_') >> EatChar('\n'));
105*a03ca8b9SKrzysztof Kosiński }
106*a03ca8b9SKrzysztof Kosiński 
TEST(IOUtilsTest,StrictUInt)107*a03ca8b9SKrzysztof Kosiński TEST(IOUtilsTest, StrictUInt) {
108*a03ca8b9SKrzysztof Kosiński   std::istringstream main_iss;
109*a03ca8b9SKrzysztof Kosiński   // Helper for single-line tests.
110*a03ca8b9SKrzysztof Kosiński   auto iss = [&main_iss](const std::string& s) -> std::istringstream& {
111*a03ca8b9SKrzysztof Kosiński     main_iss.clear();
112*a03ca8b9SKrzysztof Kosiński     main_iss.str(s);
113*a03ca8b9SKrzysztof Kosiński     return main_iss;
114*a03ca8b9SKrzysztof Kosiński   };
115*a03ca8b9SKrzysztof Kosiński 
116*a03ca8b9SKrzysztof Kosiński   uint32_t u32 = 0;
117*a03ca8b9SKrzysztof Kosiński   EXPECT_TRUE(iss("1234") >> StrictUInt<uint32_t>(u32));
118*a03ca8b9SKrzysztof Kosiński   EXPECT_EQ(uint32_t(1234), u32);
119*a03ca8b9SKrzysztof Kosiński   EXPECT_TRUE(iss("001234") >> StrictUInt<uint32_t>(u32));
120*a03ca8b9SKrzysztof Kosiński   EXPECT_EQ(uint32_t(1234), u32);
121*a03ca8b9SKrzysztof Kosiński   EXPECT_FALSE(iss("blahblah") >> StrictUInt<uint32_t>(u32));
122*a03ca8b9SKrzysztof Kosiński   EXPECT_EQ(uint32_t(1234), u32);  // No overwrite on failure.
123*a03ca8b9SKrzysztof Kosiński   EXPECT_TRUE(iss("137suffix") >> StrictUInt<uint32_t>(u32));
124*a03ca8b9SKrzysztof Kosiński   EXPECT_EQ(uint32_t(137), u32);
125*a03ca8b9SKrzysztof Kosiński   EXPECT_FALSE(iss(" 1234") >> StrictUInt<uint32_t>(u32));
126*a03ca8b9SKrzysztof Kosiński   EXPECT_FALSE(iss("-1234") >> StrictUInt<uint32_t>(u32));
127*a03ca8b9SKrzysztof Kosiński 
128*a03ca8b9SKrzysztof Kosiński   uint16_t u16 = 0;
129*a03ca8b9SKrzysztof Kosiński   EXPECT_TRUE(iss("65535") >> StrictUInt<uint16_t>(u16));
130*a03ca8b9SKrzysztof Kosiński   EXPECT_EQ(uint16_t(65535), u16);
131*a03ca8b9SKrzysztof Kosiński   EXPECT_FALSE(iss("65536") >> StrictUInt<uint16_t>(u16));  // Overflow.
132*a03ca8b9SKrzysztof Kosiński 
133*a03ca8b9SKrzysztof Kosiński   uint64_t u64 = 0;
134*a03ca8b9SKrzysztof Kosiński   EXPECT_TRUE(iss("1000000000001") >> StrictUInt<uint64_t>(u64));
135*a03ca8b9SKrzysztof Kosiński   EXPECT_EQ(uint64_t(1000000000001LL), u64);
136*a03ca8b9SKrzysztof Kosiński 
137*a03ca8b9SKrzysztof Kosiński   // uint8_t is stubbed out, so no tests for it.
138*a03ca8b9SKrzysztof Kosiński }
139*a03ca8b9SKrzysztof Kosiński 
TEST(IOUtilsTest,ParseSimpleEquations)140*a03ca8b9SKrzysztof Kosiński TEST(IOUtilsTest, ParseSimpleEquations) {
141*a03ca8b9SKrzysztof Kosiński   std::istringstream iss("123+456=579,4-3=1");
142*a03ca8b9SKrzysztof Kosiński   uint32_t a = 0;
143*a03ca8b9SKrzysztof Kosiński   uint32_t b = 0;
144*a03ca8b9SKrzysztof Kosiński   uint32_t c = 0;
145*a03ca8b9SKrzysztof Kosiński   EXPECT_TRUE(iss >> StrictUInt<uint32_t>(a) >> EatChar('+') >>
146*a03ca8b9SKrzysztof Kosiński               StrictUInt<uint32_t>(b) >> EatChar('=') >>
147*a03ca8b9SKrzysztof Kosiński               StrictUInt<uint32_t>(c));
148*a03ca8b9SKrzysztof Kosiński   EXPECT_EQ(uint32_t(123), a);
149*a03ca8b9SKrzysztof Kosiński   EXPECT_EQ(uint32_t(456), b);
150*a03ca8b9SKrzysztof Kosiński   EXPECT_EQ(uint32_t(579), c);
151*a03ca8b9SKrzysztof Kosiński   EXPECT_TRUE(iss >> EatChar(','));
152*a03ca8b9SKrzysztof Kosiński   EXPECT_TRUE(iss >> StrictUInt<uint32_t>(a) >> EatChar('-') >>
153*a03ca8b9SKrzysztof Kosiński               StrictUInt<uint32_t>(b) >> EatChar('=') >>
154*a03ca8b9SKrzysztof Kosiński               StrictUInt<uint32_t>(c));
155*a03ca8b9SKrzysztof Kosiński   EXPECT_EQ(uint32_t(4), a);
156*a03ca8b9SKrzysztof Kosiński   EXPECT_EQ(uint32_t(3), b);
157*a03ca8b9SKrzysztof Kosiński   EXPECT_EQ(uint32_t(1), c);
158*a03ca8b9SKrzysztof Kosiński }
159*a03ca8b9SKrzysztof Kosiński 
160*a03ca8b9SKrzysztof Kosiński }  // namespace zucchini
161