mirror of
https://github.com/mozilla/gecko-dev.git
synced 2025-02-19 15:51:33 +00:00
Bug 1751102, part 6 - Add some tests for nsDiscriminatedUnion. r=xpcom-reviewers,nika
Differential Revision: https://phabricator.services.mozilla.com/D137102
This commit is contained in:
parent
de223d9afd
commit
0ef92f4698
156
xpcom/tests/gtest/TestVariant.cpp
Normal file
156
xpcom/tests/gtest/TestVariant.cpp
Normal file
@ -0,0 +1,156 @@
|
||||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* vim: set ts=2 et sw=2 tw=80: */
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
|
||||
|
||||
#include <math.h>
|
||||
#include "nsVariant.h"
|
||||
#include "gtest/gtest.h"
|
||||
|
||||
TEST(Variant, DoubleNaN)
|
||||
{
|
||||
nsDiscriminatedUnion du;
|
||||
du.SetFromDouble(NAN);
|
||||
|
||||
uint8_t ui8;
|
||||
EXPECT_EQ(du.ConvertToInt8(&ui8), NS_ERROR_LOSS_OF_SIGNIFICANT_DATA);
|
||||
|
||||
int16_t i16;
|
||||
EXPECT_EQ(du.ConvertToInt16(&i16), NS_ERROR_LOSS_OF_SIGNIFICANT_DATA);
|
||||
|
||||
int32_t i32;
|
||||
EXPECT_EQ(du.ConvertToInt32(&i32), NS_ERROR_LOSS_OF_SIGNIFICANT_DATA);
|
||||
|
||||
int64_t i64;
|
||||
EXPECT_EQ(du.ConvertToInt64(&i64), NS_ERROR_LOSS_OF_SIGNIFICANT_DATA);
|
||||
|
||||
EXPECT_EQ(du.ConvertToUint8(&ui8), NS_ERROR_LOSS_OF_SIGNIFICANT_DATA);
|
||||
|
||||
uint16_t ui16;
|
||||
EXPECT_EQ(du.ConvertToUint16(&ui16), NS_ERROR_LOSS_OF_SIGNIFICANT_DATA);
|
||||
|
||||
uint32_t ui32;
|
||||
EXPECT_EQ(du.ConvertToUint32(&ui32), NS_ERROR_LOSS_OF_SIGNIFICANT_DATA);
|
||||
|
||||
uint64_t ui64;
|
||||
EXPECT_EQ(du.ConvertToUint64(&ui64), NS_ERROR_LOSS_OF_SIGNIFICANT_DATA);
|
||||
|
||||
float f = 0.0f;
|
||||
EXPECT_EQ(du.ConvertToFloat(&f), NS_OK);
|
||||
EXPECT_TRUE(isnan(f));
|
||||
|
||||
double d = 0.0;
|
||||
EXPECT_EQ(du.ConvertToDouble(&d), NS_OK);
|
||||
EXPECT_TRUE(isnan(d));
|
||||
|
||||
bool b = true;
|
||||
EXPECT_EQ(du.ConvertToBool(&b), NS_OK);
|
||||
EXPECT_FALSE(b);
|
||||
|
||||
char c;
|
||||
EXPECT_EQ(du.ConvertToChar(&c), NS_ERROR_LOSS_OF_SIGNIFICANT_DATA);
|
||||
|
||||
char16_t c16;
|
||||
EXPECT_EQ(du.ConvertToWChar(&c16), NS_ERROR_LOSS_OF_SIGNIFICANT_DATA);
|
||||
|
||||
nsID id = {};
|
||||
EXPECT_EQ(du.ConvertToID(&id), NS_ERROR_CANNOT_CONVERT_DATA);
|
||||
|
||||
nsAutoString string;
|
||||
EXPECT_EQ(du.ConvertToAString(string), NS_OK);
|
||||
EXPECT_EQ(string, u"NaN"_ns);
|
||||
|
||||
nsAutoCString utf8string;
|
||||
EXPECT_EQ(du.ConvertToAUTF8String(utf8string), NS_OK);
|
||||
EXPECT_EQ(utf8string, "NaN"_ns);
|
||||
|
||||
nsAutoCString autocstring;
|
||||
EXPECT_EQ(du.ConvertToACString(autocstring), NS_OK);
|
||||
EXPECT_EQ(autocstring, "NaN"_ns);
|
||||
|
||||
char* chars = nullptr;
|
||||
EXPECT_EQ(du.ConvertToString(&chars), NS_OK);
|
||||
EXPECT_STREQ(chars, "NaN");
|
||||
free(chars);
|
||||
|
||||
char16_t* wchars = nullptr;
|
||||
EXPECT_EQ(du.ConvertToWString(&wchars), NS_OK);
|
||||
{
|
||||
// gtest doesn't seem to support EXPECT_STREQ on char16_t, so convert
|
||||
// to Gecko strings to do the comparison.
|
||||
nsDependentString wstring(wchars);
|
||||
EXPECT_EQ(wstring, u"NaN"_ns);
|
||||
}
|
||||
free(wchars);
|
||||
|
||||
chars = nullptr;
|
||||
uint32_t size = 0;
|
||||
EXPECT_EQ(du.ConvertToStringWithSize(&size, &chars), NS_OK);
|
||||
EXPECT_STREQ(chars, "NaN");
|
||||
EXPECT_EQ(size, 3u);
|
||||
free(chars);
|
||||
|
||||
wchars = nullptr;
|
||||
size = 0;
|
||||
EXPECT_EQ(du.ConvertToWStringWithSize(&size, &wchars), NS_OK);
|
||||
{
|
||||
// gtest doesn't seem to support EXPECT_STREQ on char16_t, so convert
|
||||
// to Gecko strings to do the comparison.
|
||||
nsDependentString wstring(wchars);
|
||||
EXPECT_EQ(wstring, u"NaN"_ns);
|
||||
EXPECT_EQ(size, 3u);
|
||||
}
|
||||
free(wchars);
|
||||
|
||||
nsISupports* isupports;
|
||||
EXPECT_EQ(du.ConvertToISupports(&isupports), NS_ERROR_CANNOT_CONVERT_DATA);
|
||||
|
||||
nsIID* idp;
|
||||
void* iface;
|
||||
EXPECT_EQ(du.ConvertToInterface(&idp, &iface), NS_ERROR_CANNOT_CONVERT_DATA);
|
||||
|
||||
uint16_t type;
|
||||
nsIID iid;
|
||||
uint32_t count;
|
||||
void* array;
|
||||
EXPECT_EQ(du.ConvertToArray(&type, &iid, &count, &array),
|
||||
NS_ERROR_CANNOT_CONVERT_DATA);
|
||||
}
|
||||
|
||||
TEST(Variant, Bool)
|
||||
{
|
||||
nsDiscriminatedUnion du;
|
||||
bool b = false;
|
||||
|
||||
du.SetFromInt64(12);
|
||||
EXPECT_EQ(du.ConvertToBool(&b), NS_OK);
|
||||
EXPECT_TRUE(b);
|
||||
|
||||
b = true;
|
||||
du.SetFromInt64(0);
|
||||
EXPECT_EQ(du.ConvertToBool(&b), NS_OK);
|
||||
EXPECT_FALSE(b);
|
||||
|
||||
b = true;
|
||||
du.SetFromDouble(1.25);
|
||||
EXPECT_EQ(du.ConvertToBool(&b), NS_OK);
|
||||
EXPECT_TRUE(b);
|
||||
|
||||
b = true;
|
||||
du.SetFromDouble(0.0);
|
||||
EXPECT_EQ(du.ConvertToBool(&b), NS_OK);
|
||||
EXPECT_FALSE(b);
|
||||
|
||||
b = true;
|
||||
du.SetFromDouble(-0.0);
|
||||
EXPECT_EQ(du.ConvertToBool(&b), NS_OK);
|
||||
EXPECT_FALSE(b);
|
||||
|
||||
// This is also checked in the previous test, but I'm including it
|
||||
// here for completeness.
|
||||
b = true;
|
||||
du.SetFromDouble(NAN);
|
||||
EXPECT_EQ(du.ConvertToBool(&b), NS_OK);
|
||||
EXPECT_FALSE(b);
|
||||
}
|
@ -68,6 +68,7 @@ UNIFIED_SOURCES += [
|
||||
"TestTimeStamp.cpp",
|
||||
"TestTokenizer.cpp",
|
||||
"TestUTF.cpp",
|
||||
"TestVariant.cpp",
|
||||
]
|
||||
|
||||
if CONFIG["OS_TARGET"] != "Android":
|
||||
|
Loading…
x
Reference in New Issue
Block a user