1 /*
2 * Copyright (c) 2009-2022, Google LLC
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of Google LLC nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 * ARE DISCLAIMED. IN NO EVENT SHALL Google LLC BE LIABLE FOR ANY DIRECT,
20 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28 #include "gtest/gtest.h"
29 #include "absl/strings/string_view.h"
30 #include "upb/reflection/def_builder_internal.h"
31 #include "upb/upb.hpp"
32
33 // Must be last.
34 #include "upb/port/def.inc"
35
36 struct IdentTestData {
37 absl::string_view text;
38 bool ok;
39 };
40
41 class FullIdentTestBase : public testing::TestWithParam<IdentTestData> {};
42
TEST_P(FullIdentTestBase,CheckFullIdent)43 TEST_P(FullIdentTestBase, CheckFullIdent) {
44 upb_Status status;
45 upb_DefBuilder ctx;
46 upb::Arena arena;
47 ctx.status = &status;
48 ctx.arena = arena.ptr();
49 upb_Status_Clear(&status);
50
51 if (UPB_SETJMP(ctx.err)) {
52 EXPECT_FALSE(GetParam().ok);
53 } else {
54 _upb_DefBuilder_CheckIdentFull(
55 &ctx, upb_StringView_FromDataAndSize(GetParam().text.data(),
56 GetParam().text.size()));
57 EXPECT_TRUE(GetParam().ok);
58 }
59 }
60
61 INSTANTIATE_TEST_SUITE_P(FullIdentTest, FullIdentTestBase,
62 testing::ValuesIn(std::vector<IdentTestData>{
63 {"foo.bar", true},
64 {"foo.", true},
65 {"foo", true},
66
67 {"foo.7bar", false},
68 {".foo", false},
69 {"#", false},
70 {".", false},
71 {"", false}}));
72
73 class PartIdentTestBase : public testing::TestWithParam<IdentTestData> {};
74
TEST_P(PartIdentTestBase,TestNotFullIdent)75 TEST_P(PartIdentTestBase, TestNotFullIdent) {
76 upb_Status status;
77 upb_DefBuilder ctx;
78 upb::Arena arena;
79 ctx.status = &status;
80 ctx.arena = arena.ptr();
81 upb_Status_Clear(&status);
82
83 if (UPB_SETJMP(ctx.err)) {
84 EXPECT_FALSE(GetParam().ok);
85 } else {
86 _upb_DefBuilder_MakeFullName(
87 &ctx, "abc",
88 upb_StringView_FromDataAndSize(GetParam().text.data(),
89 GetParam().text.size()));
90 EXPECT_TRUE(GetParam().ok);
91 }
92 }
93
94 INSTANTIATE_TEST_SUITE_P(PartIdentTest, PartIdentTestBase,
95 testing::ValuesIn(std::vector<IdentTestData>{
96 {"foo", true},
97 {"foo1", true},
98
99 {"foo.bar", false},
100 {"1foo", false},
101 {"#", false},
102 {".", false},
103 {"", false}}));
104