blob: ac4a345d56f309f807173c2f1a06ee43ef9ae114 [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 <fidl/flat_ast.h>
#include <fidl/lexer.h>
#include <fidl/parser.h>
#include <fidl/source_file.h>
#include <zxtest/zxtest.h>
#include "error_test.h"
#include "test_library.h"
namespace {
TEST(StrictnessTests, BadDuplicateModifierOld) {
TestLibrary library(R"FIDL(
library example;
strict union One { 1: bool b; };
strict strict union Two { 1: bool b; }; // line 5
strict strict strict union Three { 1: bool b; }; // line 6
)FIDL");
ASSERT_FALSE(library.Compile());
const auto& errors = library.errors();
ASSERT_EQ(errors.size(), 3);
ASSERT_ERR(errors[0], fidl::ErrDuplicateModifier);
EXPECT_EQ(errors[0]->span->position().line, 5);
ASSERT_SUBSTR(errors[0]->msg.c_str(), "strict");
ASSERT_ERR(errors[1], fidl::ErrDuplicateModifier);
EXPECT_EQ(errors[1]->span->position().line, 6);
ASSERT_SUBSTR(errors[1]->msg.c_str(), "strict");
ASSERT_ERR(errors[2], fidl::ErrDuplicateModifier);
EXPECT_EQ(errors[2]->span->position().line, 6);
ASSERT_SUBSTR(errors[2]->msg.c_str(), "strict");
}
TEST(StrictnessTests, BadDuplicateModifier) {
fidl::ExperimentalFlags experimental_flags;
experimental_flags.SetFlag(fidl::ExperimentalFlags::Flag::kAllowNewSyntax);
TestLibrary library(R"FIDL(
library example;
type One = strict union { 1: b bool; };
type Two = strict strict union { 1: b bool; }; // line 5
type Three = strict strict strict union { 1: b bool; }; // line 6
)FIDL",
std::move(experimental_flags));
ASSERT_FALSE(library.Compile());
const auto& errors = library.errors();
ASSERT_EQ(errors.size(), 3);
ASSERT_ERR(errors[0], fidl::ErrDuplicateModifier);
EXPECT_EQ(errors[0]->span->position().line, 5);
ASSERT_SUBSTR(errors[0]->msg.c_str(), "strict");
ASSERT_ERR(errors[1], fidl::ErrDuplicateModifier);
EXPECT_EQ(errors[1]->span->position().line, 6);
ASSERT_SUBSTR(errors[1]->msg.c_str(), "strict");
ASSERT_ERR(errors[2], fidl::ErrDuplicateModifier);
EXPECT_EQ(errors[2]->span->position().line, 6);
ASSERT_SUBSTR(errors[2]->msg.c_str(), "strict");
}
TEST(StrictnessTests, BadConflictingModifiersOld) {
TestLibrary library(R"FIDL(
library example;
strict flexible union SF { 1: bool b; }; // line 4
flexible strict union FS { 1: bool b; }; // line 5
)FIDL");
ASSERT_ERRORED_TWICE_DURING_COMPILE(library, fidl::ErrConflictingModifier,
fidl::ErrConflictingModifier);
EXPECT_EQ(library.errors()[0]->span->position().line, 4);
ASSERT_SUBSTR(library.errors()[0]->msg.c_str(), "strict");
ASSERT_SUBSTR(library.errors()[0]->msg.c_str(), "flexible");
EXPECT_EQ(library.errors()[1]->span->position().line, 5);
ASSERT_SUBSTR(library.errors()[1]->msg.c_str(), "strict");
ASSERT_SUBSTR(library.errors()[1]->msg.c_str(), "flexible");
}
TEST(StrictnessTests, BadConflictingModifiers) {
fidl::ExperimentalFlags experimental_flags;
experimental_flags.SetFlag(fidl::ExperimentalFlags::Flag::kAllowNewSyntax);
TestLibrary library(R"FIDL(
library example;
type SF = strict flexible union { 1: b bool; }; // line 4
type FS = flexible strict union { 1: b bool; }; // line 5
)FIDL",
std::move(experimental_flags));
ASSERT_ERRORED_TWICE_DURING_COMPILE(library, fidl::ErrConflictingModifier,
fidl::ErrConflictingModifier);
EXPECT_EQ(library.errors()[0]->span->position().line, 4);
ASSERT_SUBSTR(library.errors()[0]->msg.c_str(), "strict");
ASSERT_SUBSTR(library.errors()[0]->msg.c_str(), "flexible");
EXPECT_EQ(library.errors()[1]->span->position().line, 5);
ASSERT_SUBSTR(library.errors()[1]->msg.c_str(), "strict");
ASSERT_SUBSTR(library.errors()[1]->msg.c_str(), "flexible");
}
TEST(StrictnessTests, GoodBitsStrictness) {
TestLibrary library(
R"FIDL(
library example;
bits DefaultStrictFoo {
BAR = 0x1;
};
strict bits StrictFoo {
BAR = 0x1;
};
flexible bits FlexibleFoo {
BAR = 0x1;
};
)FIDL");
ASSERT_COMPILED_AND_CONVERT(library);
EXPECT_EQ(library.LookupBits("FlexibleFoo")->strictness, fidl::types::Strictness::kFlexible);
EXPECT_EQ(library.LookupBits("StrictFoo")->strictness, fidl::types::Strictness::kStrict);
EXPECT_EQ(library.LookupBits("DefaultStrictFoo")->strictness, fidl::types::Strictness::kStrict);
}
TEST(StrictnessTests, GoodEnumStrictness) {
TestLibrary library(
R"FIDL(
library example;
enum DefaultStrictFoo {
BAR = 1;
};
strict enum StrictFoo {
BAR = 1;
};
flexible enum FlexibleFoo {
BAR = 1;
};
)FIDL");
ASSERT_COMPILED_AND_CONVERT(library);
EXPECT_EQ(library.LookupEnum("FlexibleFoo")->strictness, fidl::types::Strictness::kFlexible);
EXPECT_EQ(library.LookupEnum("StrictFoo")->strictness, fidl::types::Strictness::kStrict);
EXPECT_EQ(library.LookupEnum("DefaultStrictFoo")->strictness, fidl::types::Strictness::kStrict);
}
// TODO(fxbug.dev/73392): disallow flexible in the new syntax, and add a
// FlexibleEnumReudundant test
TEST(StrictnessTests, GoodFlexibleEnumRedundantOld) {
TestLibrary library(R"FIDL(
library example;
flexible enum Foo {
BAR = 1;
};
)FIDL");
ASSERT_TRUE(library.Compile());
}
// TODO(fxbug.dev/73392): disallow flexible in the new syntax, and add a
// FlexibleBitsRedundant test
TEST(StrictnessTests, GoodFlexibleBitsRedundantOld) {
TestLibrary library(R"FIDL(
library example;
flexible bits Foo {
BAR = 0x1;
};
)FIDL");
ASSERT_TRUE(library.Compile());
}
TEST(StrictnessTests, BadStrictnessStruct) {
TestLibrary library(R"FIDL(
library example;
strict struct Foo {
int32 i;
};
)FIDL");
ASSERT_ERRORED_DURING_COMPILE(library, fidl::ErrCannotSpecifyModifier);
}
TEST(StrictnessTests, BadStrictnessTable) {
TestLibrary library("table", R"FIDL(
library example;
strict table StrictFoo {
};
)FIDL");
ASSERT_ERRORED_DURING_COMPILE(library, fidl::ErrCannotSpecifyModifier);
}
TEST(StrictnessTests, GoodUnionStrictness) {
TestLibrary library(R"FIDL(
library example;
union Foo {
1: int32 i;
};
flexible union FlexibleFoo {
1: int32 i;
};
strict union StrictFoo {
1: int32 i;
};
)FIDL");
ASSERT_COMPILED_AND_CONVERT(library);
EXPECT_EQ(library.LookupUnion("Foo")->strictness, fidl::types::Strictness::kStrict);
EXPECT_EQ(library.LookupUnion("FlexibleFoo")->strictness, fidl::types::Strictness::kFlexible);
EXPECT_EQ(library.LookupUnion("StrictFoo")->strictness, fidl::types::Strictness::kStrict);
}
TEST(StrictnessTests, GoodStrictUnionRedundant) {
TestLibrary library(R"FIDL(
library example;
strict union Foo {
1: int32 i;
};
)FIDL");
ASSERT_COMPILED_AND_CONVERT(library);
ASSERT_EQ(library.LookupUnion("Foo")->strictness, fidl::types::Strictness::kStrict);
}
} // namespace