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