| // Copyright (C) 2014 The Android Open Source Project |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| #include "emugl/common/stringparsing.h" |
| |
| #include <gtest/gtest.h> |
| |
| namespace emugl { |
| |
| TEST(StringParsing, Empty) { |
| std::string e; |
| std::string replace_res = replace_with(std::string("a"), |
| std::string("b"), |
| e); |
| EXPECT_STREQ("", replace_res.c_str()); |
| |
| bool err = false; |
| std::string remove_inout_res = |
| remove_in_out(e, e, e, &err); |
| EXPECT_FALSE(err); |
| |
| EXPECT_STREQ("", remove_inout_res.c_str()); |
| |
| std::vector<std::string> isolate_inout_res = |
| isolate_in_out(e, e, e, &err); |
| EXPECT_FALSE(err); |
| |
| EXPECT_EQ(0, isolate_inout_res.size()); |
| |
| std::vector<std::string> split_res = |
| split(e, e); |
| EXPECT_EQ(0, split_res.size()); |
| |
| std::vector<std::string> split_nonempty_delim_res = |
| split(std::string("("), e); |
| EXPECT_EQ(0, split_res.size()); |
| } |
| |
| TEST(StringParsing, Simple) { |
| std::string e("a b (1 2 3) (4 5) (6 7)"); |
| std::string replace_res = replace_with(std::string("a"), |
| std::string("b"), |
| e); |
| EXPECT_STREQ("b", replace_res.substr(0,1).c_str()); |
| |
| // Replace with something longer than the string itself |
| replace_res = replace_with(std::string("2"), |
| std::string("asdfasdfasdfasdfasdfasdfasdf"), |
| e); |
| EXPECT_STREQ("a b (1 asdfasdfasdfasdfasdfasdfasdf 3) (4 5) (6 7)", |
| replace_res.c_str()); |
| |
| |
| bool err = false; |
| std::string remove_inout_res = |
| remove_in_out(e, "(", ")", &err); |
| EXPECT_FALSE(err); |
| EXPECT_STREQ("a b ", remove_inout_res.c_str()); |
| |
| std::vector<std::string> isolate_inout_res = |
| isolate_in_out(e, "(", ")", &err); |
| EXPECT_FALSE(err); |
| EXPECT_EQ(3, isolate_inout_res.size()); |
| EXPECT_STREQ("1 2 3", isolate_inout_res[0].c_str()); |
| EXPECT_STREQ("4 5", isolate_inout_res[1].c_str()); |
| EXPECT_STREQ("6 7", isolate_inout_res[2].c_str()); |
| |
| std::vector<std::string> split_res = |
| split(" ", e); |
| EXPECT_EQ(9, split_res.size()); |
| EXPECT_STREQ("a", split_res[0].c_str()); |
| EXPECT_STREQ("b", split_res[1].c_str()); |
| EXPECT_STREQ("(1", split_res[2].c_str()); |
| EXPECT_STREQ("2", split_res[3].c_str()); |
| EXPECT_STREQ("3)", split_res[4].c_str()); |
| EXPECT_STREQ("(4", split_res[5].c_str()); |
| EXPECT_STREQ("5)", split_res[6].c_str()); |
| EXPECT_STREQ("(6", split_res[7].c_str()); |
| EXPECT_STREQ("7)", split_res[8].c_str()); |
| |
| // multi_find returns position of the last one |
| size_t match_res = multi_find(e, split_res); |
| EXPECT_EQ(21, match_res); |
| |
| // multi_find returns std::string::npos |
| // if there aren't any matches |
| std::vector<std::string> nomatches; |
| nomatches.push_back("{"); |
| nomatches.push_back("}"); |
| nomatches.push_back("8"); |
| nomatches.push_back("asdf"); |
| EXPECT_EQ(std::string::npos, multi_find(e, nomatches)); |
| |
| // Split with trailing delimiter |
| split_res = split(" ", std::string("1 2 3 ")); |
| EXPECT_EQ(3, split_res.size()); |
| |
| // Split with multiple trailing delimiters |
| split_res = split(" ", std::string("1 2 3 ")); |
| EXPECT_EQ(4, split_res.size()); |
| EXPECT_STREQ("", split_res[3].c_str()); |
| |
| // Split with multiple delimiters |
| split_res = split(" ", std::string("1 2 3 ")); |
| EXPECT_EQ(5, split_res.size()); |
| EXPECT_STREQ("", split_res[4].c_str()); |
| |
| // Cases where we expect err = true: |
| // 1. Only one level deep is supported |
| // 2. Partial in/out matches |
| std::string f0("a b (1 2 3 (4 5) (6 7))"); |
| std::string f1("(a b"); |
| std::string f2("a b)"); |
| |
| err = false; |
| remove_inout_res = remove_in_out(f0, "(", ")", &err); |
| EXPECT_TRUE(err); |
| EXPECT_STREQ(f0.c_str(), remove_inout_res.c_str()); |
| |
| err = false; |
| isolate_inout_res = isolate_in_out(f0, "(", ")", &err); |
| EXPECT_TRUE(err); |
| EXPECT_EQ(0, isolate_inout_res.size()); |
| |
| err = false; |
| remove_inout_res = remove_in_out(f1, "(", ")", &err); |
| EXPECT_TRUE(err); |
| |
| err = false; |
| isolate_inout_res = isolate_in_out(f1, "(", ")", &err); |
| EXPECT_TRUE(err); |
| |
| err = false; |
| remove_inout_res = remove_in_out(f2, "(", ")", &err); |
| EXPECT_TRUE(err); |
| |
| err = false; |
| isolate_inout_res = isolate_in_out(f2, "(", ")", &err); |
| EXPECT_TRUE(err); |
| } |
| |
| } // namespace emugl |