xref: /aosp_15_r20/external/tensorflow/tensorflow/lite/testing/message_test.cc (revision b6fb3261f9314811a0f4371741dbb8839866f948)
1 /* Copyright 2017 The TensorFlow Authors. All Rights Reserved.
2 
3 Licensed under the Apache License, Version 2.0 (the "License");
4 you may not use this file except in compliance with the License.
5 You may obtain a copy of the License at
6 
7     http://www.apache.org/licenses/LICENSE-2.0
8 
9 Unless required by applicable law or agreed to in writing, software
10 distributed under the License is distributed on an "AS IS" BASIS,
11 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 See the License for the specific language governing permissions and
13 limitations under the License.
14 ==============================================================================*/
15 #include "tensorflow/lite/testing/message.h"
16 
17 #include <map>
18 #include <string>
19 
20 #include <gmock/gmock.h>
21 #include <gtest/gtest.h>
22 
23 namespace tflite {
24 namespace testing {
25 namespace {
26 
27 // A hierarchical, key-value store.
28 class TestMessage : public Message {
29  public:
TestMessage()30   TestMessage() {}
TestMessage(const std::string & text_to_parse)31   explicit TestMessage(const std::string& text_to_parse) {
32     std::stringstream ss(text_to_parse);
33     finished_ = Message::Read(&ss, this);
34   }
SetField(const std::string & name,const std::string & value)35   void SetField(const std::string& name, const std::string& value) override {
36     fields_[name] = value;
37   }
AddChild(const std::string & name)38   Message* AddChild(const std::string& name) override {
39     TestMessage* m = new TestMessage;
40     m->name_ = name;
41     return Store(m);
42   }
Finish()43   void Finish() override { finished_ = true; }
44 
NumChildren() const45   int NumChildren() const { return Children().size(); }
46 
GetChild(int i) const47   const TestMessage* GetChild(int i) const {
48     return dynamic_cast<TestMessage*>(Children()[i].get());
49   }
50 
NumFields() const51   int NumFields() const { return fields_.size(); }
GetField(const std::string & key) const52   const std::string& GetField(const std::string& key) const {
53     return fields_.at(key);
54   }
55 
name() const56   const std::string& name() const { return name_; }
finished() const57   bool finished() const { return finished_; }
58 
59  protected:
60   std::string name_;
61   std::map<std::string, std::string> fields_;
62   bool finished_ = false;
63 };
64 
TEST(MessageTest,Simple)65 TEST(MessageTest, Simple) {
66   TestMessage message("x{a:1 b:2} y{} z{c:3} d:4");
67   ASSERT_TRUE(message.finished());
68 
69   ASSERT_EQ(message.NumFields(), 1);
70   EXPECT_EQ(message.GetField("d"), "4");
71 
72   ASSERT_EQ(message.NumChildren(), 3);
73 
74   auto* x = message.GetChild(0);
75   EXPECT_EQ(x->name(), "x");
76   ASSERT_EQ(x->NumFields(), 2);
77   EXPECT_EQ(x->GetField("a"), "1");
78   EXPECT_EQ(x->GetField("b"), "2");
79 
80   auto* y = message.GetChild(1);
81   EXPECT_EQ(y->name(), "y");
82   ASSERT_EQ(y->NumFields(), 0);
83 
84   auto* z = message.GetChild(2);
85   EXPECT_EQ(z->name(), "z");
86   ASSERT_EQ(z->NumFields(), 1);
87   EXPECT_EQ(z->GetField("c"), "3");
88 }
89 
TEST(MessageTest,Unnamed)90 TEST(MessageTest, Unnamed) {
91   TestMessage message("x{c:3} {} y{d:4}");
92   ASSERT_FALSE(message.finished());
93   EXPECT_EQ(message.NumChildren(), 1);
94 }
95 
TEST(MessageTest,TooManyBraces)96 TEST(MessageTest, TooManyBraces) {
97   TestMessage message("x{c:3} } y{d:4}");
98   ASSERT_FALSE(message.finished());
99   EXPECT_EQ(message.NumChildren(), 1);
100 }
101 
TEST(MessageTest,LeftoverToken)102 TEST(MessageTest, LeftoverToken) {
103   TestMessage message("x{c:3} z{test} y{d:4}");
104   ASSERT_FALSE(message.finished());
105   EXPECT_EQ(message.NumChildren(), 2);
106 }
107 
TEST(MessageTest,MissingKey)108 TEST(MessageTest, MissingKey) {
109   TestMessage message("x{c:3} z{:test} y{d:4}");
110   ASSERT_FALSE(message.finished());
111   EXPECT_EQ(message.NumChildren(), 2);
112 }
113 
TEST(MessageTest,MissingValue)114 TEST(MessageTest, MissingValue) {
115   TestMessage message("x{c:3} z{test:} y{d:4}");
116   ASSERT_FALSE(message.finished());
117   EXPECT_EQ(message.NumChildren(), 2);
118 }
119 
120 }  // namespace
121 }  // namespace testing
122 }  // namespace tflite
123