156 lines
4 KiB
C++
156 lines
4 KiB
C++
/* -*- 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);
|
|
}
|