Fixed incorrect string comparison on some platforms (fixes #1198)

This commit is contained in:
Benoit Blanchon
2020-02-27 11:44:09 +01:00
parent 2996503b27
commit 2641697e0b
10 changed files with 110 additions and 57 deletions

View File

@ -4,9 +4,11 @@
#include "custom_string.hpp"
#include "progmem_emulation.hpp"
#include "weird_strcmp.hpp"
#include <ArduinoJson/Strings/ConstRamStringAdapter.hpp>
#include <ArduinoJson/Strings/FlashStringAdapter.hpp>
#include <ArduinoJson/Strings/SizedRamStringAdapter.hpp>
#include <ArduinoJson/Strings/StlStringAdapter.hpp>
#include <catch.hpp>
@ -17,27 +19,55 @@ TEST_CASE("ConstRamStringAdapter") {
SECTION("null") {
ConstRamStringAdapter adapter(NULL);
REQUIRE(adapter.compare("bravo") < 0);
REQUIRE(adapter.compare(NULL) == 0);
CHECK(adapter.compare("bravo") < 0);
CHECK(adapter.compare(NULL) == 0);
REQUIRE(adapter.equals(NULL));
REQUIRE_FALSE(adapter.equals("charlie"));
CHECK(adapter.equals(NULL));
CHECK_FALSE(adapter.equals("charlie"));
REQUIRE(adapter.size() == 0);
CHECK(adapter.size() == 0);
}
SECTION("non-null") {
ConstRamStringAdapter adapter("bravo");
REQUIRE(adapter.compare(NULL) > 0);
REQUIRE(adapter.compare("alpha") > 0);
REQUIRE(adapter.compare("bravo") == 0);
REQUIRE(adapter.compare("charlie") < 0);
CHECK(adapter.compare(NULL) > 0);
CHECK(adapter.compare("alpha") > 0);
CHECK(adapter.compare("bravo") == 0);
CHECK(adapter.compare("charlie") < 0);
REQUIRE(adapter.equals("bravo"));
REQUIRE_FALSE(adapter.equals("charlie"));
CHECK(adapter.equals("bravo"));
CHECK_FALSE(adapter.equals("charlie"));
REQUIRE(adapter.size() == 5);
CHECK(adapter.size() == 5);
}
}
TEST_CASE("SizedRamStringAdapter") {
SECTION("null") {
SizedRamStringAdapter adapter(NULL, 10);
CHECK(adapter.compare("bravo") < 0);
CHECK(adapter.compare(NULL) == 0);
CHECK(adapter.equals(NULL));
CHECK_FALSE(adapter.equals("charlie"));
CHECK(adapter.size() == 10);
}
SECTION("non-null") {
SizedRamStringAdapter adapter("bravo", 5);
CHECK(adapter.compare(NULL) > 0);
CHECK(adapter.compare("alpha") > 0);
CHECK(adapter.compare("bravo") == 0);
CHECK(adapter.compare("charlie") < 0);
CHECK(adapter.equals("bravo"));
CHECK_FALSE(adapter.equals("charlie"));
CHECK(adapter.size() == 5);
}
}
@ -45,27 +75,27 @@ TEST_CASE("FlashStringAdapter") {
SECTION("null") {
FlashStringAdapter adapter(NULL);
REQUIRE(adapter.compare("bravo") < 0);
REQUIRE(adapter.compare(NULL) == 0);
CHECK(adapter.compare("bravo") < 0);
CHECK(adapter.compare(NULL) == 0);
REQUIRE(adapter.equals(NULL));
REQUIRE_FALSE(adapter.equals("charlie"));
CHECK(adapter.equals(NULL));
CHECK_FALSE(adapter.equals("charlie"));
REQUIRE(adapter.size() == 0);
CHECK(adapter.size() == 0);
}
SECTION("non-null") {
FlashStringAdapter adapter = adaptString(F("bravo"));
REQUIRE(adapter.compare(NULL) > 0);
REQUIRE(adapter.compare("alpha") > 0);
REQUIRE(adapter.compare("bravo") == 0);
REQUIRE(adapter.compare("charlie") < 0);
CHECK(adapter.compare(NULL) > 0);
CHECK(adapter.compare("alpha") > 0);
CHECK(adapter.compare("bravo") == 0);
CHECK(adapter.compare("charlie") < 0);
REQUIRE(adapter.equals("bravo"));
REQUIRE_FALSE(adapter.equals("charlie"));
CHECK(adapter.equals("bravo"));
CHECK_FALSE(adapter.equals("charlie"));
REQUIRE(adapter.size() == 5);
CHECK(adapter.size() == 5);
}
}
@ -73,46 +103,46 @@ TEST_CASE("std::string") {
std::string str("bravo");
StlStringAdapter<std::string> adapter = adaptString(str);
REQUIRE(adapter.compare(NULL) > 0);
REQUIRE(adapter.compare("alpha") > 0);
REQUIRE(adapter.compare("bravo") == 0);
REQUIRE(adapter.compare("charlie") < 0);
CHECK(adapter.compare(NULL) > 0);
CHECK(adapter.compare("alpha") > 0);
CHECK(adapter.compare("bravo") == 0);
CHECK(adapter.compare("charlie") < 0);
REQUIRE(adapter.equals("bravo"));
REQUIRE_FALSE(adapter.equals("charlie"));
CHECK(adapter.equals("bravo"));
CHECK_FALSE(adapter.equals("charlie"));
REQUIRE(adapter.size() == 5);
CHECK(adapter.size() == 5);
}
TEST_CASE("custom_string") {
custom_string str("bravo");
StlStringAdapter<custom_string> adapter = adaptString(str);
REQUIRE(adapter.compare(NULL) > 0);
REQUIRE(adapter.compare("alpha") > 0);
REQUIRE(adapter.compare("bravo") == 0);
REQUIRE(adapter.compare("charlie") < 0);
CHECK(adapter.compare(NULL) > 0);
CHECK(adapter.compare("alpha") > 0);
CHECK(adapter.compare("bravo") == 0);
CHECK(adapter.compare("charlie") < 0);
REQUIRE(adapter.equals("bravo"));
REQUIRE_FALSE(adapter.equals("charlie"));
CHECK(adapter.equals("bravo"));
CHECK_FALSE(adapter.equals("charlie"));
REQUIRE(adapter.size() == 5);
CHECK(adapter.size() == 5);
}
TEST_CASE("IsString<T>") {
SECTION("std::string") {
REQUIRE(IsString<std::string>::value == true);
CHECK(IsString<std::string>::value == true);
}
SECTION("basic_string<wchar_t>") {
REQUIRE(IsString<std::basic_string<wchar_t> >::value == false);
CHECK(IsString<std::basic_string<wchar_t> >::value == false);
}
SECTION("custom_string") {
REQUIRE(IsString<custom_string>::value == true);
CHECK(IsString<custom_string>::value == true);
}
SECTION("const __FlashStringHelper*") {
REQUIRE(IsString<const __FlashStringHelper*>::value == true);
CHECK(IsString<const __FlashStringHelper*>::value == true);
}
}