blob: eb2281bbd886f96db9f649bfddfb946788863343 [file] [log] [blame]
// Copyright 2019 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 "test_library.h"
namespace {
bool primitive() {
BEGIN_TEST;
TestLibrary library(R"FIDL(
library example;
struct Message {
alias_of_int16 f;
};
using alias_of_int16 = int16;
)FIDL");
ASSERT_TRUE(library.Compile());
auto msg = library.LookupStruct("Message");
ASSERT_NONNULL(msg);
ASSERT_EQ(msg->members.size(), 1);
auto type = msg->members[0].type_ctor->type;
ASSERT_EQ(type->kind, fidl::flat::Type::Kind::kPrimitive);
ASSERT_EQ(type->nullability, fidl::types::Nullability::kNonnullable);
auto primitive_type = static_cast<const fidl::flat::PrimitiveType*>(type);
ASSERT_EQ(primitive_type->subtype, fidl::types::PrimitiveSubtype::kInt16);
END_TEST;
}
bool primitive_type_alias_before_use() {
BEGIN_TEST;
TestLibrary library(R"FIDL(
library example;
using alias_of_int16 = int16;
struct Message {
alias_of_int16 f;
};
)FIDL");
ASSERT_TRUE(library.Compile());
auto msg = library.LookupStruct("Message");
ASSERT_NONNULL(msg);
ASSERT_EQ(msg->members.size(), 1);
auto type = msg->members[0].type_ctor->type;
ASSERT_EQ(type->kind, fidl::flat::Type::Kind::kPrimitive);
ASSERT_EQ(type->nullability, fidl::types::Nullability::kNonnullable);
auto primitive_type = static_cast<const fidl::flat::PrimitiveType*>(type);
ASSERT_EQ(primitive_type->subtype, fidl::types::PrimitiveSubtype::kInt16);
END_TEST;
}
bool vector_parametrized_on_decl() {
BEGIN_TEST;
TestLibrary library(R"FIDL(
library example;
struct Message {
alias_of_vector_of_string f;
};
using alias_of_vector_of_string = vector<string>;
)FIDL");
ASSERT_TRUE(library.Compile());
auto msg = library.LookupStruct("Message");
ASSERT_NONNULL(msg);
ASSERT_EQ(msg->members.size(), 1);
auto type = msg->members[0].type_ctor->type;
ASSERT_EQ(type->kind, fidl::flat::Type::Kind::kVector);
ASSERT_EQ(type->nullability, fidl::types::Nullability::kNonnullable);
auto vector_type = static_cast<const fidl::flat::VectorType*>(type);
ASSERT_EQ(vector_type->element_type->kind, fidl::flat::Type::Kind::kString);
ASSERT_EQ(static_cast<uint32_t>(*vector_type->element_count),
static_cast<uint32_t>(fidl::flat::Size::Max()));
END_TEST;
}
bool vector_parametrized_on_use() {
BEGIN_TEST;
TestLibrary library(R"FIDL(
library example;
struct Message {
alias_of_vector<uint8> f;
};
using alias_of_vector = vector;
)FIDL");
ASSERT_TRUE(library.Compile());
auto msg = library.LookupStruct("Message");
ASSERT_NONNULL(msg);
ASSERT_EQ(msg->members.size(), 1);
auto type = msg->members[0].type_ctor->type;
ASSERT_EQ(type->kind, fidl::flat::Type::Kind::kVector);
ASSERT_EQ(type->nullability, fidl::types::Nullability::kNonnullable);
auto vector_type = static_cast<const fidl::flat::VectorType*>(type);
ASSERT_EQ(vector_type->element_type->kind, fidl::flat::Type::Kind::kPrimitive);
ASSERT_EQ(static_cast<uint32_t>(*vector_type->element_count),
static_cast<uint32_t>(fidl::flat::Size::Max()));
auto primitive_element_type = static_cast<const fidl::flat::PrimitiveType*>(vector_type->element_type);
ASSERT_EQ(primitive_element_type->subtype, fidl::types::PrimitiveSubtype::kUint8);
END_TEST;
}
bool vector_bounded_on_decl() {
BEGIN_TEST;
TestLibrary library(R"FIDL(
library example;
struct Message {
alias_of_vector_max_8<string> f;
};
using alias_of_vector_max_8 = vector:8;
)FIDL");
ASSERT_TRUE(library.Compile());
auto msg = library.LookupStruct("Message");
ASSERT_NONNULL(msg);
ASSERT_EQ(msg->members.size(), 1);
auto type = msg->members[0].type_ctor->type;
ASSERT_EQ(type->kind, fidl::flat::Type::Kind::kVector);
ASSERT_EQ(type->nullability, fidl::types::Nullability::kNonnullable);
auto vector_type = static_cast<const fidl::flat::VectorType*>(type);
ASSERT_EQ(vector_type->element_type->kind, fidl::flat::Type::Kind::kString);
ASSERT_EQ(static_cast<uint32_t>(*vector_type->element_count),
8u);
END_TEST;
}
bool vector_bounded_on_use() {
BEGIN_TEST;
TestLibrary library(R"FIDL(
library example;
struct Message {
alias_of_vector_of_string:8 f;
};
using alias_of_vector_of_string = vector<string>;
)FIDL");
ASSERT_TRUE(library.Compile());
auto msg = library.LookupStruct("Message");
ASSERT_NONNULL(msg);
ASSERT_EQ(msg->members.size(), 1);
auto type = msg->members[0].type_ctor->type;
ASSERT_EQ(type->kind, fidl::flat::Type::Kind::kVector);
ASSERT_EQ(type->nullability, fidl::types::Nullability::kNonnullable);
auto vector_type = static_cast<const fidl::flat::VectorType*>(type);
ASSERT_EQ(vector_type->element_type->kind, fidl::flat::Type::Kind::kString);
ASSERT_EQ(static_cast<uint32_t>(*vector_type->element_count),
8u);
END_TEST;
}
bool vector_nullable_on_decl() {
BEGIN_TEST;
TestLibrary library(R"FIDL(
library example;
struct Message {
alias_of_vector_of_string_nullable f;
};
using alias_of_vector_of_string_nullable = vector<string>?;
)FIDL");
ASSERT_TRUE(library.Compile());
auto msg = library.LookupStruct("Message");
ASSERT_NONNULL(msg);
ASSERT_EQ(msg->members.size(), 1);
auto type = msg->members[0].type_ctor->type;
ASSERT_EQ(type->kind, fidl::flat::Type::Kind::kVector);
ASSERT_EQ(type->nullability, fidl::types::Nullability::kNullable);
auto vector_type = static_cast<const fidl::flat::VectorType*>(type);
ASSERT_EQ(vector_type->element_type->kind, fidl::flat::Type::Kind::kString);
ASSERT_EQ(static_cast<uint32_t>(*vector_type->element_count),
static_cast<uint32_t>(fidl::flat::Size::Max()));
END_TEST;
}
bool vector_nullable_on_use() {
BEGIN_TEST;
TestLibrary library(R"FIDL(
library example;
struct Message {
alias_of_vector_of_string? f;
};
using alias_of_vector_of_string = vector<string>;
)FIDL");
ASSERT_TRUE(library.Compile());
auto msg = library.LookupStruct("Message");
ASSERT_NONNULL(msg);
ASSERT_EQ(msg->members.size(), 1);
auto type = msg->members[0].type_ctor->type;
ASSERT_EQ(type->kind, fidl::flat::Type::Kind::kVector);
ASSERT_EQ(type->nullability, fidl::types::Nullability::kNullable);
auto vector_type = static_cast<const fidl::flat::VectorType*>(type);
ASSERT_EQ(vector_type->element_type->kind, fidl::flat::Type::Kind::kString);
ASSERT_EQ(static_cast<uint32_t>(*vector_type->element_count),
static_cast<uint32_t>(fidl::flat::Size::Max()));
END_TEST;
}
bool invalid_cannot_parametrize_twice() {
BEGIN_TEST;
TestLibrary library(R"FIDL(
library example;
struct Message {
alias_of_vector_of_string<string> f;
};
using alias_of_vector_of_string = vector<string>;
)FIDL");
ASSERT_FALSE(library.Compile());
auto errors = library.errors();
ASSERT_EQ(errors.size(), 1);
ASSERT_STR_STR(errors[0].c_str(), "cannot parametrize twice");
END_TEST;
}
bool invalid_cannot_bound_twice() {
BEGIN_TEST;
TestLibrary library(R"FIDL(
library example;
struct Message {
alias_of_vector_of_string_max_5:9 f;
};
using alias_of_vector_of_string_max_5 = vector<string>:5;
)FIDL");
ASSERT_FALSE(library.Compile());
auto errors = library.errors();
ASSERT_EQ(errors.size(), 1);
ASSERT_STR_STR(errors[0].c_str(), "cannot bound twice");
END_TEST;
}
bool invalid_cannot_null_twice() {
BEGIN_TEST;
TestLibrary library(R"FIDL(
library example;
struct Message {
alias_of_vector_nullable<string>? f;
};
using alias_of_vector_nullable = vector?;
)FIDL");
ASSERT_FALSE(library.Compile());
auto errors = library.errors();
ASSERT_EQ(errors.size(), 1);
ASSERT_STR_STR(errors[0].c_str(), "cannot indicate nullability twice");
END_TEST;
}
} // namespace
BEGIN_TEST_CASE(type_alias_tests)
RUN_TEST(primitive)
RUN_TEST(primitive_type_alias_before_use)
RUN_TEST(vector_parametrized_on_decl)
RUN_TEST(vector_parametrized_on_use)
RUN_TEST(vector_bounded_on_decl)
RUN_TEST(vector_bounded_on_use)
RUN_TEST(vector_nullable_on_decl)
RUN_TEST(vector_nullable_on_use)
RUN_TEST(invalid_cannot_parametrize_twice)
RUN_TEST(invalid_cannot_bound_twice)
RUN_TEST(invalid_cannot_null_twice)
END_TEST_CASE(type_alias_tests)