1 // Protocol Buffers - Google's data interchange format
2 // Copyright 2023 Google LLC. All rights reserved.
3 //
4 // Use of this source code is governed by a BSD-style
5 // license that can be found in the LICENSE file or at
6 // https://developers.google.com/open-source/licenses/bsd
7
8 #include "upb/reflection/internal/def_builder.h"
9
10 #include <gtest/gtest.h>
11 #include "absl/strings/string_view.h"
12 #include "upb/mem/arena.hpp"
13
14 // Must be last.
15 #include "upb/port/def.inc"
16
17 struct IdentTestData {
18 absl::string_view text;
19 bool ok;
20 };
21
22 class FullIdentTestBase : public testing::TestWithParam<IdentTestData> {};
23
TEST_P(FullIdentTestBase,CheckFullIdent)24 TEST_P(FullIdentTestBase, CheckFullIdent) {
25 upb_Status status;
26 upb_DefBuilder ctx;
27 upb::Arena arena;
28 ctx.status = &status;
29 ctx.arena = arena.ptr();
30 upb_Status_Clear(&status);
31
32 if (UPB_SETJMP(ctx.err)) {
33 EXPECT_FALSE(GetParam().ok);
34 } else {
35 _upb_DefBuilder_CheckIdentFull(
36 &ctx, upb_StringView_FromDataAndSize(GetParam().text.data(),
37 GetParam().text.size()));
38 EXPECT_TRUE(GetParam().ok);
39 }
40 }
41
42 INSTANTIATE_TEST_SUITE_P(FullIdentTest, FullIdentTestBase,
43 testing::ValuesIn(std::vector<IdentTestData>{
44 {"foo.bar", true},
45 {"foo.", true},
46 {"foo", true},
47
48 {"foo.7bar", false},
49 {".foo", false},
50 {"#", false},
51 {".", false},
52 {"", false}}));
53
54 class PartIdentTestBase : public testing::TestWithParam<IdentTestData> {};
55
TEST_P(PartIdentTestBase,TestNotFullIdent)56 TEST_P(PartIdentTestBase, TestNotFullIdent) {
57 upb_Status status;
58 upb_DefBuilder ctx;
59 upb::Arena arena;
60 ctx.status = &status;
61 ctx.arena = arena.ptr();
62 upb_Status_Clear(&status);
63
64 if (UPB_SETJMP(ctx.err)) {
65 EXPECT_FALSE(GetParam().ok);
66 } else {
67 _upb_DefBuilder_MakeFullName(
68 &ctx, "abc",
69 upb_StringView_FromDataAndSize(GetParam().text.data(),
70 GetParam().text.size()));
71 EXPECT_TRUE(GetParam().ok);
72 }
73 }
74
75 INSTANTIATE_TEST_SUITE_P(PartIdentTest, PartIdentTestBase,
76 testing::ValuesIn(std::vector<IdentTestData>{
77 {"foo", true},
78 {"foo1", true},
79
80 {"foo.bar", false},
81 {"1foo", false},
82 {"#", false},
83 {".", false},
84 {"", false}}));
85