capnproto

FORK: Cap'n Proto serialization/RPC system - core tools and C++ library
git clone https://git.neptards.moe/neptards/capnproto.git
Log | Files | Refs | README | LICENSE

char-test.c++ (10866B)


      1 // Copyright (c) 2013-2014 Sandstorm Development Group, Inc. and contributors
      2 // Licensed under the MIT License:
      3 //
      4 // Permission is hereby granted, free of charge, to any person obtaining a copy
      5 // of this software and associated documentation files (the "Software"), to deal
      6 // in the Software without restriction, including without limitation the rights
      7 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
      8 // copies of the Software, and to permit persons to whom the Software is
      9 // furnished to do so, subject to the following conditions:
     10 //
     11 // The above copyright notice and this permission notice shall be included in
     12 // all copies or substantial portions of the Software.
     13 //
     14 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     15 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     16 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
     17 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     18 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
     19 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
     20 // THE SOFTWARE.
     21 
     22 #include "char.h"
     23 #include "../string.h"
     24 #include <kj/compat/gtest.h>
     25 
     26 namespace kj {
     27 namespace parse {
     28 namespace {
     29 
     30 typedef IteratorInput<char, const char*> Input;
     31 typedef Span<const char*> TestLocation;
     32 
     33 TEST(CharParsers, ExactChar) {
     34   constexpr auto parser = exactChar<'a'>();
     35 
     36   {
     37     StringPtr text = "a";
     38     Input input(text.begin(), text.end());
     39     EXPECT_TRUE(parser(input) != nullptr);
     40     EXPECT_TRUE(input.atEnd());
     41   }
     42 
     43   {
     44     StringPtr text = "b";
     45     Input input(text.begin(), text.end());
     46     EXPECT_TRUE(parser(input) == nullptr);
     47     EXPECT_FALSE(input.atEnd());
     48   }
     49 }
     50 
     51 TEST(CharParsers, ExactString) {
     52   constexpr auto parser = exactString("foo");
     53 
     54   {
     55     StringPtr text = "foobar";
     56     Input input(text.begin(), text.end());
     57     EXPECT_TRUE(parser(input) != nullptr);
     58     ASSERT_FALSE(input.atEnd());
     59     EXPECT_EQ('b', input.current());
     60   }
     61 
     62   {
     63     StringPtr text = "bar";
     64     Input input(text.begin(), text.end());
     65     EXPECT_TRUE(parser(input) == nullptr);
     66     EXPECT_FALSE(input.atEnd());
     67     EXPECT_EQ('b', input.current());
     68   }
     69 }
     70 
     71 TEST(CharParsers, CharRange) {
     72   constexpr auto parser = charRange('a', 'z');
     73 
     74   {
     75     StringPtr text = "a";
     76     Input input(text.begin(), text.end());
     77     Maybe<char> result = parser(input);
     78     KJ_IF_MAYBE(value, result) {
     79       EXPECT_EQ('a', *value);
     80     } else {
     81       ADD_FAILURE() << "Expected parse result, got null.";
     82     }
     83     EXPECT_TRUE(input.atEnd());
     84   }
     85 
     86   {
     87     StringPtr text = "n";
     88     Input input(text.begin(), text.end());
     89     Maybe<char> result = parser(input);
     90     KJ_IF_MAYBE(value, result) {
     91       EXPECT_EQ('n', *value);
     92     } else {
     93       ADD_FAILURE() << "Expected parse result, got null.";
     94     }
     95     EXPECT_TRUE(input.atEnd());
     96   }
     97 
     98   {
     99     StringPtr text = "z";
    100     Input input(text.begin(), text.end());
    101     Maybe<char> result = parser(input);
    102     KJ_IF_MAYBE(value, result) {
    103       EXPECT_EQ('z', *value);
    104     } else {
    105       ADD_FAILURE() << "Expected parse result, got null.";
    106     }
    107     EXPECT_TRUE(input.atEnd());
    108   }
    109 
    110   {
    111     StringPtr text = "`";
    112     Input input(text.begin(), text.end());
    113     Maybe<char> result = parser(input);
    114     EXPECT_TRUE(result == nullptr);
    115     EXPECT_FALSE(input.atEnd());
    116   }
    117 
    118   {
    119     StringPtr text = "{";
    120     Input input(text.begin(), text.end());
    121     Maybe<char> result = parser(input);
    122     EXPECT_TRUE(result == nullptr);
    123     EXPECT_FALSE(input.atEnd());
    124   }
    125 
    126   {
    127     StringPtr text = "A";
    128     Input input(text.begin(), text.end());
    129     Maybe<char> result = parser(input);
    130     EXPECT_TRUE(result == nullptr);
    131     EXPECT_FALSE(input.atEnd());
    132   }
    133 }
    134 
    135 TEST(CharParsers, AnyOfChars) {
    136   constexpr auto parser = anyOfChars("axn2B");
    137 
    138   {
    139     StringPtr text = "a";
    140     Input input(text.begin(), text.end());
    141     Maybe<char> result = parser(input);
    142     KJ_IF_MAYBE(value, result) {
    143       EXPECT_EQ('a', *value);
    144     } else {
    145       ADD_FAILURE() << "Expected parse result, got null.";
    146     }
    147     EXPECT_TRUE(input.atEnd());
    148   }
    149 
    150   {
    151     StringPtr text = "n";
    152     Input input(text.begin(), text.end());
    153     Maybe<char> result = parser(input);
    154     KJ_IF_MAYBE(value, result) {
    155       EXPECT_EQ('n', *value);
    156     } else {
    157       ADD_FAILURE() << "Expected parse result, got null.";
    158     }
    159     EXPECT_TRUE(input.atEnd());
    160   }
    161 
    162   {
    163     StringPtr text = "B";
    164     Input input(text.begin(), text.end());
    165     Maybe<char> result = parser(input);
    166     KJ_IF_MAYBE(value, result) {
    167       EXPECT_EQ('B', *value);
    168     } else {
    169       ADD_FAILURE() << "Expected parse result, got null.";
    170     }
    171     EXPECT_TRUE(input.atEnd());
    172   }
    173 
    174   {
    175     StringPtr text = "b";
    176     Input input(text.begin(), text.end());
    177     Maybe<char> result = parser(input);
    178     EXPECT_TRUE(result == nullptr);
    179     EXPECT_FALSE(input.atEnd());
    180   }
    181 
    182   {
    183     StringPtr text = "j";
    184     Input input(text.begin(), text.end());
    185     Maybe<char> result = parser(input);
    186     EXPECT_TRUE(result == nullptr);
    187     EXPECT_FALSE(input.atEnd());
    188   }
    189 
    190   {
    191     StringPtr text = "A";
    192     Input input(text.begin(), text.end());
    193     Maybe<char> result = parser(input);
    194     EXPECT_TRUE(result == nullptr);
    195     EXPECT_FALSE(input.atEnd());
    196   }
    197 }
    198 
    199 TEST(CharParsers, CharGroupCombo) {
    200   constexpr auto parser =
    201       many(charRange('0', '9').orRange('a', 'z').orRange('A', 'Z').orAny("-_"));
    202 
    203   {
    204     StringPtr text = "foo1-bar2_baz3@qux";
    205     Input input(text.begin(), text.end());
    206     Maybe<Array<char>> result = parser(input);
    207     KJ_IF_MAYBE(value, result) {
    208       EXPECT_EQ("foo1-bar2_baz3", str(*value));
    209     } else {
    210       ADD_FAILURE() << "Expected parse result, got null.";
    211     }
    212     EXPECT_FALSE(input.atEnd());
    213   }
    214 }
    215 
    216 TEST(CharParsers, Identifier) {
    217   constexpr auto parser = identifier;
    218 
    219   {
    220     StringPtr text = "helloWorld123 ";
    221     Input input(text.begin(), text.end());
    222     Maybe<String> result = parser(input);
    223     KJ_IF_MAYBE(value, result) {
    224       EXPECT_EQ("helloWorld123", *value);
    225     } else {
    226       ADD_FAILURE() << "Expected string, got null.";
    227     }
    228     EXPECT_FALSE(input.atEnd());
    229   }
    230 }
    231 
    232 TEST(CharParsers, Integer) {
    233   constexpr auto parser = integer;
    234 
    235   {
    236     StringPtr text = "12349";
    237     Input input(text.begin(), text.end());
    238     Maybe<uint64_t> result = parser(input);
    239     KJ_IF_MAYBE(value, result) {
    240       EXPECT_EQ(12349u, *value);
    241     } else {
    242       ADD_FAILURE() << "Expected integer, got null.";
    243     }
    244     EXPECT_TRUE(input.atEnd());
    245   }
    246 
    247   {
    248     StringPtr text = "0x1aF0";
    249     Input input(text.begin(), text.end());
    250     Maybe<uint64_t> result = parser(input);
    251     KJ_IF_MAYBE(value, result) {
    252       EXPECT_EQ(0x1aF0u, *value);
    253     } else {
    254       ADD_FAILURE() << "Expected integer, got null.";
    255     }
    256     EXPECT_TRUE(input.atEnd());
    257   }
    258 
    259   {
    260     StringPtr text = "064270";
    261     Input input(text.begin(), text.end());
    262     Maybe<uint64_t> result = parser(input);
    263     KJ_IF_MAYBE(value, result) {
    264       EXPECT_EQ(064270u, *value);
    265     } else {
    266       ADD_FAILURE() << "Expected integer, got null.";
    267     }
    268     EXPECT_TRUE(input.atEnd());
    269   }
    270 }
    271 
    272 TEST(CharParsers, Number) {
    273   constexpr auto parser = number;
    274 
    275   {
    276     StringPtr text = "12345";
    277     Input input(text.begin(), text.end());
    278     Maybe<double> result = parser(input);
    279     KJ_IF_MAYBE(value, result) {
    280       EXPECT_EQ(12345, *value);
    281     } else {
    282       ADD_FAILURE() << "Expected number, got null.";
    283     }
    284     EXPECT_TRUE(input.atEnd());
    285   }
    286 
    287   {
    288     StringPtr text = "123.25";
    289     Input input(text.begin(), text.end());
    290     Maybe<double> result = parser(input);
    291     KJ_IF_MAYBE(value, result) {
    292       EXPECT_EQ(123.25, *value);
    293     } else {
    294       ADD_FAILURE() << "Expected number, got null.";
    295     }
    296     EXPECT_TRUE(input.atEnd());
    297   }
    298 
    299   {
    300     StringPtr text = "123e10";
    301     Input input(text.begin(), text.end());
    302     Maybe<double> result = parser(input);
    303     KJ_IF_MAYBE(value, result) {
    304       EXPECT_EQ(123e10, *value);
    305     } else {
    306       ADD_FAILURE() << "Expected number, got null.";
    307     }
    308     EXPECT_TRUE(input.atEnd());
    309   }
    310 
    311   {
    312     StringPtr text = "123.25E+10";
    313     Input input(text.begin(), text.end());
    314     Maybe<double> result = parser(input);
    315     KJ_IF_MAYBE(value, result) {
    316       EXPECT_EQ(123.25E+10, *value);
    317     } else {
    318       ADD_FAILURE() << "Expected number, got null.";
    319     }
    320     EXPECT_TRUE(input.atEnd());
    321   }
    322 
    323   {
    324     StringPtr text = "25e-2";
    325     Input input(text.begin(), text.end());
    326     Maybe<double> result = parser(input);
    327     KJ_IF_MAYBE(value, result) {
    328       EXPECT_EQ(25e-2, *value);
    329     } else {
    330       ADD_FAILURE() << "Expected number, got null.";
    331     }
    332     EXPECT_TRUE(input.atEnd());
    333   }
    334 }
    335 
    336 TEST(CharParsers, DoubleQuotedString) {
    337   constexpr auto parser = doubleQuotedString;
    338 
    339   {
    340     StringPtr text = "\"hello\"";
    341     Input input(text.begin(), text.end());
    342     Maybe<String> result = parser(input);
    343     KJ_IF_MAYBE(value, result) {
    344       EXPECT_EQ("hello", *value);
    345     } else {
    346       ADD_FAILURE() << "Expected \"hello\", got null.";
    347     }
    348     EXPECT_TRUE(input.atEnd());
    349   }
    350 
    351   {
    352     StringPtr text = "\"test\\a\\b\\f\\n\\r\\t\\v\\\'\\\"\\\?\\x01\\x20\\2\\34\\156\"";
    353     Input input(text.begin(), text.end());
    354     Maybe<String> result = parser(input);
    355     KJ_IF_MAYBE(value, result) {
    356       EXPECT_EQ("test\a\b\f\n\r\t\v\'\"\?\x01\x20\2\34\156", *value);
    357     } else {
    358       ADD_FAILURE() << "Expected string, got null.";
    359     }
    360     EXPECT_TRUE(input.atEnd());
    361   }
    362 
    363   {
    364     StringPtr text = "\"foo'bar\"";
    365     Input input(text.begin(), text.end());
    366     Maybe<String> result = parser(input);
    367     KJ_IF_MAYBE(value, result) {
    368       EXPECT_EQ("foo'bar", *value);
    369     } else {
    370       ADD_FAILURE() << "Expected string, got null.";
    371     }
    372     EXPECT_TRUE(input.atEnd());
    373   }
    374 }
    375 
    376 TEST(CharParsers, SingleQuotedString) {
    377   constexpr auto parser = singleQuotedString;
    378 
    379   {
    380     StringPtr text = "\'hello\'";
    381     Input input(text.begin(), text.end());
    382     Maybe<String> result = parser(input);
    383     KJ_IF_MAYBE(value, result) {
    384       EXPECT_EQ("hello", *value);
    385     } else {
    386       ADD_FAILURE() << "Expected \"hello\", got null.";
    387     }
    388     EXPECT_TRUE(input.atEnd());
    389   }
    390 
    391   {
    392     StringPtr text = "\'test\\a\\b\\f\\n\\r\\t\\v\\\'\\\"\\\?\x01\2\34\156\'";
    393     Input input(text.begin(), text.end());
    394     Maybe<String> result = parser(input);
    395     KJ_IF_MAYBE(value, result) {
    396       EXPECT_EQ("test\a\b\f\n\r\t\v\'\"\?\x01\2\34\156", *value);
    397     } else {
    398       ADD_FAILURE() << "Expected string, got null.";
    399     }
    400     EXPECT_TRUE(input.atEnd());
    401   }
    402 
    403   {
    404     StringPtr text = "\'foo\"bar\'";
    405     Input input(text.begin(), text.end());
    406     Maybe<String> result = parser(input);
    407     KJ_IF_MAYBE(value, result) {
    408       EXPECT_EQ("foo\"bar", *value);
    409     } else {
    410       ADD_FAILURE() << "Expected string, got null.";
    411     }
    412     EXPECT_TRUE(input.atEnd());
    413   }
    414 }
    415 
    416 }  // namespace
    417 }  // namespace parse
    418 }  // namespace kj