| /* |
| * Copyright 2021 Daniel R. Carvalho |
| * |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted provided that the following conditions are |
| * met: redistributions of source code must retain the above copyright |
| * notice, this list of conditions and the following disclaimer; |
| * redistributions in binary form must reproduce the above copyright |
| * notice, this list of conditions and the following disclaimer in the |
| * documentation and/or other materials provided with the distribution; |
| * neither the name of the copyright holders nor the names of its |
| * contributors may be used to endorse or promote products derived from |
| * this software without specific prior written permission. |
| * |
| * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
| * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
| * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
| * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
| * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
| * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
| * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
| * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
| * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| */ |
| |
| #include <gtest/gtest.h> |
| |
| #include <cstdint> |
| #include <string> |
| |
| #include "sim/serialize_handlers.hh" |
| |
| using namespace gem5; |
| |
| TEST(SerializeTest, ParseParamInt8) |
| { |
| ParseParam<int8_t> parser; |
| int8_t value(0); |
| |
| // Zero |
| EXPECT_TRUE(parser.parse("0", value)); |
| EXPECT_EQ(0, value); |
| |
| // Booleans |
| EXPECT_FALSE(parser.parse("true", value)); |
| EXPECT_FALSE(parser.parse("false", value)); |
| |
| // 8-bit values |
| EXPECT_FALSE(parser.parse("255", value)); |
| EXPECT_TRUE(parser.parse("-128", value)); |
| EXPECT_EQ(-128, value); |
| |
| // 16-bit values |
| EXPECT_FALSE(parser.parse("1000", value)); |
| EXPECT_FALSE(parser.parse("-1000", value)); |
| |
| // 32-bit values |
| EXPECT_FALSE(parser.parse("2147483648", value)); |
| EXPECT_FALSE(parser.parse("-1073741824", value)); |
| |
| // Doubles (scientific numbers should not be converted to integers |
| // correctly) |
| EXPECT_FALSE(parser.parse("123456.789", value)); |
| EXPECT_FALSE(parser.parse("-123456.789", value)); |
| EXPECT_FALSE(parser.parse("9.87654e+06", value)); |
| |
| // Characters |
| EXPECT_TRUE(parser.parse("69", value)); |
| EXPECT_EQ(69, value); |
| EXPECT_TRUE(parser.parse("97", value)); |
| EXPECT_EQ(97, value); |
| |
| // Strings |
| EXPECT_FALSE(parser.parse("Test", value)); |
| } |
| |
| TEST(SerializeTest, ParseParamUint32) |
| { |
| ParseParam<uint32_t> parser; |
| uint32_t value(0); |
| |
| // Zero |
| EXPECT_TRUE(parser.parse("0", value)); |
| EXPECT_EQ(0, value); |
| |
| // Booleans |
| EXPECT_FALSE(parser.parse("true", value)); |
| EXPECT_FALSE(parser.parse("false", value)); |
| |
| // 8-bit values |
| EXPECT_TRUE(parser.parse("255", value)); |
| EXPECT_EQ(255, value); |
| EXPECT_FALSE(parser.parse("-128", value)); |
| |
| // 16-bit values |
| EXPECT_TRUE(parser.parse("1000", value)); |
| EXPECT_EQ(1000, value); |
| EXPECT_FALSE(parser.parse("-1000", value)); |
| |
| // 32-bit values |
| EXPECT_TRUE(parser.parse("2147483648", value)); |
| EXPECT_EQ(2147483648, value); |
| EXPECT_FALSE(parser.parse("-1073741824", value)); |
| |
| // Doubles (scientific numbers should not be converted to integers |
| // correctly) |
| EXPECT_TRUE(parser.parse("123456.789", value)); |
| EXPECT_EQ(123456, value); |
| EXPECT_FALSE(parser.parse("-123456.789", value)); |
| EXPECT_FALSE(parser.parse("9.87654e+06", value)); |
| |
| // Characters |
| EXPECT_TRUE(parser.parse("69", value)); |
| EXPECT_EQ(69, value); |
| EXPECT_TRUE(parser.parse("97", value)); |
| EXPECT_EQ(97, value); |
| |
| // Strings |
| EXPECT_FALSE(parser.parse("Test", value)); |
| } |
| |
| TEST(SerializeTest, ParseParamDouble) |
| { |
| ParseParam<double> parser; |
| double value(0.0); |
| |
| // Zero |
| EXPECT_TRUE(parser.parse("0", value)); |
| EXPECT_EQ(0.0, value); |
| |
| // Booleans |
| EXPECT_FALSE(parser.parse("true", value)); |
| EXPECT_FALSE(parser.parse("false", value)); |
| |
| // 8-bit values |
| EXPECT_TRUE(parser.parse("255", value)); |
| EXPECT_EQ(255.0, value); |
| EXPECT_TRUE(parser.parse("-128", value)); |
| EXPECT_EQ(-128.0, value); |
| |
| // 16-bit values |
| EXPECT_TRUE(parser.parse("1000", value)); |
| EXPECT_EQ(1000.0, value); |
| EXPECT_TRUE(parser.parse("-1000", value)); |
| EXPECT_EQ(-1000.0, value); |
| |
| // 32-bit values |
| EXPECT_TRUE(parser.parse("2147483648", value)); |
| EXPECT_EQ(2147483648.0, value); |
| EXPECT_TRUE(parser.parse("-1073741824", value)); |
| EXPECT_EQ(-1073741824.0, value); |
| |
| // Doubles |
| EXPECT_TRUE(parser.parse("123456.789", value)); |
| EXPECT_EQ(123456.789, value); |
| EXPECT_TRUE(parser.parse("-123456.789", value)); |
| EXPECT_EQ(-123456.789, value); |
| EXPECT_TRUE(parser.parse("9.87654e+06", value)); |
| EXPECT_EQ(9.87654e+06, value); |
| |
| // Characters |
| EXPECT_TRUE(parser.parse("69", value)); |
| EXPECT_EQ(69.0, value); |
| EXPECT_TRUE(parser.parse("97", value)); |
| EXPECT_EQ(97.0, value); |
| |
| // Strings |
| EXPECT_FALSE(parser.parse("Test", value)); |
| } |
| |
| TEST(SerializeTest, ParseParamBool) |
| { |
| ParseParam<bool> parser; |
| bool value(false); |
| |
| // Zero |
| EXPECT_FALSE(parser.parse("0", value)); |
| |
| // Booleans |
| EXPECT_TRUE(parser.parse("true", value)); |
| EXPECT_EQ(true, value); |
| EXPECT_TRUE(parser.parse("false", value)); |
| EXPECT_EQ(false, value); |
| |
| // 8-bit values |
| EXPECT_FALSE(parser.parse("255", value)); |
| EXPECT_FALSE(parser.parse("-128", value)); |
| |
| // 16-bit values |
| EXPECT_FALSE(parser.parse("1000", value)); |
| EXPECT_FALSE(parser.parse("-1000", value)); |
| |
| // 32-bit values |
| EXPECT_FALSE(parser.parse("2147483648", value)); |
| EXPECT_FALSE(parser.parse("-1073741824", value)); |
| |
| // Doubles |
| EXPECT_FALSE(parser.parse("123456.789", value)); |
| EXPECT_FALSE(parser.parse("-123456.789", value)); |
| EXPECT_FALSE(parser.parse("9.87654e+06", value)); |
| |
| // Characters |
| EXPECT_FALSE(parser.parse("69", value)); |
| EXPECT_FALSE(parser.parse("97", value)); |
| |
| // Strings |
| EXPECT_FALSE(parser.parse("Test", value)); |
| } |
| |
| /** Characters are parsed as integers. */ |
| TEST(SerializeTest, ParseParamChar) |
| { |
| ParseParam<char> parser; |
| char value; |
| |
| // Zero |
| EXPECT_TRUE(parser.parse("48", value)); |
| EXPECT_EQ('0', value); |
| |
| // Booleans |
| EXPECT_FALSE(parser.parse("true", value)); |
| EXPECT_FALSE(parser.parse("false", value)); |
| |
| // 8-bit values |
| if constexpr (std::is_signed_v<char>) { |
| EXPECT_FALSE(parser.parse("255", value)); |
| EXPECT_TRUE(parser.parse("-128", value)); |
| EXPECT_EQ(char(-128), value); |
| } else { |
| EXPECT_FALSE(parser.parse("256", value)); |
| EXPECT_TRUE(parser.parse("255", value)); |
| EXPECT_EQ(char(255), value); |
| } |
| |
| // 16-bit values |
| EXPECT_FALSE(parser.parse("1000", value)); |
| EXPECT_FALSE(parser.parse("-1000", value)); |
| |
| // 32-bit values |
| EXPECT_FALSE(parser.parse("2147483648", value)); |
| EXPECT_FALSE(parser.parse("-1073741824", value)); |
| |
| // Doubles |
| EXPECT_FALSE(parser.parse("123456.789", value)); |
| EXPECT_FALSE(parser.parse("-123456.789", value)); |
| EXPECT_FALSE(parser.parse("9.87654e+06", value)); |
| |
| // Characters |
| EXPECT_TRUE(parser.parse("69", value)); |
| EXPECT_EQ('E', value); |
| EXPECT_TRUE(parser.parse("97", value)); |
| EXPECT_EQ('a', value); |
| |
| // Strings |
| EXPECT_FALSE(parser.parse("Test", value)); |
| } |
| |
| TEST(SerializeTest, ParseParamString) |
| { |
| ParseParam<std::string> parser; |
| std::string value(""); |
| |
| // Zero |
| EXPECT_TRUE(parser.parse("0", value)); |
| EXPECT_EQ("0", value); |
| |
| // Booleans |
| EXPECT_TRUE(parser.parse("true", value)); |
| EXPECT_EQ("true", value); |
| EXPECT_TRUE(parser.parse("false", value)); |
| EXPECT_EQ("false", value); |
| |
| // 8-bit values |
| EXPECT_TRUE(parser.parse("255", value)); |
| EXPECT_EQ("255", value); |
| EXPECT_TRUE(parser.parse("-128", value)); |
| EXPECT_EQ("-128", value); |
| |
| // 16-bit values |
| EXPECT_TRUE(parser.parse("1000", value)); |
| EXPECT_EQ("1000", value); |
| EXPECT_TRUE(parser.parse("-1000", value)); |
| EXPECT_EQ("-1000", value); |
| |
| // 32-bit values |
| EXPECT_TRUE(parser.parse("2147483648", value)); |
| EXPECT_EQ("2147483648", value); |
| EXPECT_TRUE(parser.parse("-1073741824", value)); |
| EXPECT_EQ("-1073741824", value); |
| |
| // Doubles |
| EXPECT_TRUE(parser.parse("123456.789", value)); |
| EXPECT_EQ("123456.789", value); |
| EXPECT_TRUE(parser.parse("-123456.789", value)); |
| EXPECT_EQ("-123456.789", value); |
| EXPECT_TRUE(parser.parse("9.87654e+06", value)); |
| EXPECT_EQ("9.87654e+06", value); |
| |
| // Characters |
| EXPECT_TRUE(parser.parse("69", value)); |
| EXPECT_EQ("69", value); |
| EXPECT_TRUE(parser.parse("97", value)); |
| EXPECT_EQ("97", value); |
| |
| // Strings |
| EXPECT_TRUE(parser.parse("Test", value)); |
| EXPECT_EQ("Test", value); |
| } |
| |
| TEST(SerializeTest, ShowParamInt8) |
| { |
| ShowParam<int8_t> parser; |
| std::stringstream ss; |
| |
| parser.show(ss, 0); |
| EXPECT_EQ("0", ss.str()); |
| ss.str(""); |
| parser.show(ss, 127); |
| EXPECT_EQ("127", ss.str()); |
| ss.str(""); |
| parser.show(ss, -128); |
| EXPECT_EQ("-128", ss.str()); |
| ss.str(""); |
| } |
| |
| TEST(SerializeTest, ShowParamUint32) |
| { |
| ShowParam<uint32_t> parser; |
| std::stringstream ss; |
| |
| parser.show(ss, 0); |
| EXPECT_EQ("0", ss.str()); |
| ss.str(""); |
| parser.show(ss, 255); |
| EXPECT_EQ("255", ss.str()); |
| ss.str(""); |
| parser.show(ss, 1000); |
| EXPECT_EQ("1000", ss.str()); |
| ss.str(""); |
| parser.show(ss, 2147483648); |
| EXPECT_EQ("2147483648", ss.str()); |
| ss.str(""); |
| parser.show(ss, (double)123456.789); |
| EXPECT_EQ("123456", ss.str()); |
| ss.str(""); |
| parser.show(ss, 9.87654e+06); |
| EXPECT_EQ("9876540", ss.str()); |
| ss.str(""); |
| } |
| |
| /** |
| * Test converting doubles to strings. Floating numbers are expected to |
| * have 6-digit precision. |
| */ |
| TEST(SerializeTest, ShowParamDouble) |
| { |
| ShowParam<double> parser; |
| std::stringstream ss; |
| |
| parser.show(ss, 0); |
| EXPECT_EQ("0", ss.str()); |
| ss.str(""); |
| parser.show(ss, 255); |
| EXPECT_EQ("255", ss.str()); |
| ss.str(""); |
| parser.show(ss, -1000); |
| EXPECT_EQ("-1000", ss.str()); |
| ss.str(""); |
| parser.show(ss, 123456.789); |
| EXPECT_EQ("123457", ss.str()); |
| ss.str(""); |
| parser.show(ss, -123456.789); |
| EXPECT_EQ("-123457", ss.str()); |
| ss.str(""); |
| parser.show(ss, 1234567.89); |
| EXPECT_EQ("1.23457e+06", ss.str()); |
| ss.str(""); |
| parser.show(ss, -1234567.89); |
| EXPECT_EQ("-1.23457e+06", ss.str()); |
| ss.str(""); |
| parser.show(ss, 9.87654e+06); |
| EXPECT_EQ("9.87654e+06", ss.str()); |
| ss.str(""); |
| } |
| |
| TEST(SerializeTest, ShowParamBool) |
| { |
| ShowParam<bool> parser; |
| std::stringstream ss; |
| |
| parser.show(ss, true); |
| EXPECT_EQ("true", ss.str()); |
| ss.str(""); |
| parser.show(ss, false); |
| EXPECT_EQ("false", ss.str()); |
| ss.str(""); |
| } |
| |
| TEST(SerializeTest, ShowParamChar) |
| { |
| ShowParam<char> parser; |
| std::stringstream ss; |
| |
| parser.show(ss, 'E'); |
| EXPECT_EQ("69", ss.str()); // int('E')=69 |
| ss.str(""); |
| parser.show(ss, 'a'); |
| EXPECT_EQ("97", ss.str()); // int('a')=97 |
| ss.str(""); |
| } |
| |
| TEST(SerializeTest, ShowParamString) |
| { |
| ShowParam<std::string> parser; |
| std::stringstream ss; |
| |
| parser.show(ss, "test"); |
| EXPECT_EQ("test", ss.str()); |
| ss.str(""); |
| parser.show(ss, "tEsT"); |
| EXPECT_EQ("tEsT", ss.str()); |
| ss.str(""); |
| } |