blob: c0cba2899519f0462b5e21cc1075ec32c8e14210 [file] [log] [blame]
// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <unittest/unittest.h>
// #include <fidl/flat_ast.h>
// #include <fidl/lexer.h>
// #include <fidl/parser.h>
// #include <fidl/source_file.h>
#include "test_library.h"
namespace {
bool GoodConstTestBool() {
BEGIN_TEST;
TestLibrary library(R"FIDL(
library example;
const bool c = false;
)FIDL");
ASSERT_TRUE(library.Compile());
END_TEST;
}
bool BadConstTestBoolWithString() {
BEGIN_TEST;
TestLibrary library(R"FIDL(
library example;
const bool c = "foo";
)FIDL");
ASSERT_FALSE(library.Compile());
auto errors = library.errors();
ASSERT_GE(errors.size(), 1);
ASSERT_STR_STR(errors[0].c_str(), "\"foo\" cannot be interpreted as type bool");
END_TEST;
}
bool BadConstTestBoolWithNumeric() {
BEGIN_TEST;
TestLibrary library(R"FIDL(
library example;
const bool c = 6;
)FIDL");
ASSERT_FALSE(library.Compile());
auto errors = library.errors();
ASSERT_GE(errors.size(), 1);
ASSERT_STR_STR(errors[0].c_str(), "6 cannot be interpreted as type bool");
END_TEST;
}
bool GoodConstTestInt32() {
BEGIN_TEST;
TestLibrary library(R"FIDL(
library example;
const int32 c = 42;
)FIDL");
ASSERT_TRUE(library.Compile());
END_TEST;
}
bool GoodConstTestInt32FromOtherConst() {
BEGIN_TEST;
TestLibrary library(R"FIDL(
library example;
const int32 b = 42;
const int32 c = b;
)FIDL");
ASSERT_TRUE(library.Compile());
END_TEST;
}
bool BadConstTestInt32WithString() {
BEGIN_TEST;
TestLibrary library(R"FIDL(
library example;
const int32 c = "foo";
)FIDL");
ASSERT_FALSE(library.Compile());
auto errors = library.errors();
ASSERT_GE(errors.size(), 1);
ASSERT_STR_STR(errors[0].c_str(), "\"foo\" cannot be interpreted as type int32");
END_TEST;
}
bool BadConstTestInt32WithBool() {
BEGIN_TEST;
TestLibrary library(R"FIDL(
library example;
const int32 c = true;
)FIDL");
ASSERT_FALSE(library.Compile());
auto errors = library.errors();
ASSERT_GE(errors.size(), 1);
ASSERT_STR_STR(errors[0].c_str(), "true cannot be interpreted as type int32");
END_TEST;
}
bool GoodConstTesUint64() {
BEGIN_TEST;
TestLibrary library(R"FIDL(
library example;
const int64 a = 42;
)FIDL");
ASSERT_TRUE(library.Compile());
END_TEST;
}
bool GoodConstTestUint64FromOtherUint32() {
BEGIN_TEST;
TestLibrary library(R"FIDL(
library example;
const uint32 a = 42;
const uint64 b = a;
)FIDL");
ASSERT_TRUE(library.Compile());
END_TEST;
}
bool BadConstTestUint64Negative() {
BEGIN_TEST;
TestLibrary library(R"FIDL(
library example;
const uint64 a = -42;
)FIDL");
ASSERT_FALSE(library.Compile());
auto errors = library.errors();
ASSERT_GE(errors.size(), 1);
ASSERT_STR_STR(errors[0].c_str(), "-42 cannot be interpreted as type uint64");
END_TEST;
}
bool BadConstTestUint64Overflow() {
BEGIN_TEST;
TestLibrary library(R"FIDL(
library example;
const uint64 a = 18446744073709551616;
)FIDL");
ASSERT_FALSE(library.Compile());
auto errors = library.errors();
ASSERT_GE(errors.size(), 1);
ASSERT_STR_STR(errors[0].c_str(), "18446744073709551616 cannot be interpreted as type uint64");
END_TEST;
}
bool GoodConstTestFloat32() {
BEGIN_TEST;
TestLibrary library(R"FIDL(
library example;
const float32 b = 1.61803;
const float32 c = -36.46216;
)FIDL");
ASSERT_TRUE(library.Compile());
END_TEST;
}
bool GoodConstTestFloat32HighLimit() {
BEGIN_TEST;
TestLibrary library(R"FIDL(
library example;
const float32 hi = 3.402823e38;
)FIDL");
ASSERT_TRUE(library.Compile());
END_TEST;
}
bool GoodConstTestFloat32LowLimit() {
BEGIN_TEST;
TestLibrary library(R"FIDL(
library example;
const float32 lo = -3.40282e38;
)FIDL");
ASSERT_TRUE(library.Compile());
END_TEST;
}
bool BadConstTestFloat32HighLimit() {
BEGIN_TEST;
TestLibrary library(R"FIDL(
library example;
const float32 hi = 3.41e38;
)FIDL");
ASSERT_FALSE(library.Compile());
auto errors = library.errors();
ASSERT_GE(errors.size(), 1);
ASSERT_STR_STR(errors[0].c_str(), "3.41e38 cannot be interpreted as type float32");
END_TEST;
}
bool BadConstTestFloat32LowLimit() {
BEGIN_TEST;
TestLibrary library(R"FIDL(
library example;
const float32 b = -3.41e38;
)FIDL");
ASSERT_FALSE(library.Compile());
auto errors = library.errors();
ASSERT_GE(errors.size(), 1);
ASSERT_STR_STR(errors[0].c_str(), "-3.41e38 cannot be interpreted as type float32");
END_TEST;
}
bool GoodConstTestString() {
BEGIN_TEST;
TestLibrary library(R"FIDL(
library example;
const string:4 c = "four";
)FIDL");
ASSERT_TRUE(library.Compile());
END_TEST;
}
bool GoodConstTestStringFromOtherConst() {
BEGIN_TEST;
TestLibrary library(R"FIDL(
library example;
const string:4 c = "four";
const string:5 d = c;
)FIDL");
ASSERT_TRUE(library.Compile());
END_TEST;
}
bool BadConstTestStringWithNumeric() {
BEGIN_TEST;
TestLibrary library(R"FIDL(
library example;
const string c = 4;
)FIDL");
ASSERT_FALSE(library.Compile());
auto errors = library.errors();
ASSERT_GE(errors.size(), 1);
ASSERT_STR_STR(errors[0].c_str(), "4 cannot be interpreted as type string");
END_TEST;
}
bool BadConstTestStringWithBool() {
BEGIN_TEST;
TestLibrary library(R"FIDL(
library example;
const string c = true;
)FIDL");
ASSERT_FALSE(library.Compile());
auto errors = library.errors();
ASSERT_GE(errors.size(), 1);
ASSERT_STR_STR(errors[0].c_str(), "true cannot be interpreted as type string");
END_TEST;
}
bool BadConstTestStringWithStringTooLong() {
BEGIN_TEST;
TestLibrary library(R"FIDL(
library example;
const string:4 c = "hello";
)FIDL");
ASSERT_FALSE(library.Compile());
auto errors = library.errors();
ASSERT_GE(errors.size(), 1);
ASSERT_STR_STR(errors[0].c_str(),
"\"hello\" (string:5) exceeds the size bound of type string:4");
END_TEST;
}
bool GoodConstTestUsing() {
BEGIN_TEST;
TestLibrary library(R"FIDL(
library example;
using foo = int32;
const foo c = 2;
)FIDL");
ASSERT_TRUE(library.Compile());
END_TEST;
}
bool BadConstTestUsingWithInconvertibleValue() {
BEGIN_TEST;
TestLibrary library(R"FIDL(
library example;
using foo = int32;
const foo c = "nope";
)FIDL");
ASSERT_FALSE(library.Compile());
auto errors = library.errors();
ASSERT_GE(errors.size(), 1);
ASSERT_STR_STR(errors[0].c_str(), "\"nope\" cannot be interpreted as type int32");
END_TEST;
}
bool BadConstTestNullableString() {
BEGIN_TEST;
TestLibrary library(R"FIDL(
library example;
const string? c = "";
)FIDL");
ASSERT_FALSE(library.Compile());
auto errors = library.errors();
ASSERT_GE(errors.size(), 1);
ASSERT_STR_STR(errors[0].c_str(), "invalid constant type string?");
END_TEST;
}
bool BadConstTestEnum() {
BEGIN_TEST;
TestLibrary library(R"FIDL(
library example;
enum MyEnum : int32 { A = 5; };
const MyEnum c = "";
)FIDL");
ASSERT_FALSE(library.Compile());
auto errors = library.errors();
ASSERT_GE(errors.size(), 1);
ASSERT_STR_STR(errors[0].c_str(), "invalid constant type example/MyEnum");
END_TEST;
}
bool BadConstTestArray() {
BEGIN_TEST;
TestLibrary library(R"FIDL(
library example;
const array<int32>:2 c = -1;
)FIDL");
ASSERT_FALSE(library.Compile());
auto errors = library.errors();
ASSERT_GE(errors.size(), 1);
ASSERT_STR_STR(errors[0].c_str(), "invalid constant type array<int32>:2");
END_TEST;
}
bool BadConstTestVector() {
BEGIN_TEST;
TestLibrary library(R"FIDL(
library example;
const vector<int32>:2 c = -1;
)FIDL");
ASSERT_FALSE(library.Compile());
auto errors = library.errors();
ASSERT_GE(errors.size(), 1);
ASSERT_STR_STR(errors[0].c_str(), "invalid constant type vector<int32>:2");
END_TEST;
}
bool BadConstTestHandleOfThread() {
BEGIN_TEST;
TestLibrary library(R"FIDL(
library example;
const handle<thread> c = -1;
)FIDL");
ASSERT_FALSE(library.Compile());
auto errors = library.errors();
ASSERT_GE(errors.size(), 1);
ASSERT_STR_STR(errors[0].c_str(), "invalid constant type handle<thread>");
END_TEST;
}
} // namespace
BEGIN_TEST_CASE(consts_tests);
RUN_TEST(GoodConstTestBool);
RUN_TEST(BadConstTestBoolWithString);
RUN_TEST(BadConstTestBoolWithNumeric);
RUN_TEST(GoodConstTestInt32);
RUN_TEST(GoodConstTestInt32FromOtherConst);
RUN_TEST(BadConstTestInt32WithString);
RUN_TEST(BadConstTestInt32WithBool);
RUN_TEST(GoodConstTesUint64);
RUN_TEST(GoodConstTestUint64FromOtherUint32);
RUN_TEST(BadConstTestUint64Negative);
RUN_TEST(BadConstTestUint64Overflow);
RUN_TEST(GoodConstTestFloat32);
RUN_TEST(GoodConstTestFloat32HighLimit);
RUN_TEST(GoodConstTestFloat32LowLimit);
RUN_TEST(BadConstTestFloat32HighLimit);
RUN_TEST(BadConstTestFloat32LowLimit);
RUN_TEST(GoodConstTestString);
RUN_TEST(GoodConstTestStringFromOtherConst);
RUN_TEST(BadConstTestStringWithNumeric);
RUN_TEST(BadConstTestStringWithBool);
RUN_TEST(BadConstTestStringWithStringTooLong);
RUN_TEST(GoodConstTestUsing);
RUN_TEST(BadConstTestUsingWithInconvertibleValue);
RUN_TEST(BadConstTestNullableString);
RUN_TEST(BadConstTestEnum);
RUN_TEST(BadConstTestArray);
RUN_TEST(BadConstTestVector);
RUN_TEST(BadConstTestHandleOfThread);
END_TEST_CASE(consts_tests);