2021-10-30 04:25:12 +08:00
|
|
|
// This file is part of the Luau programming language and is licensed under MIT License; see LICENSE.txt for details
|
|
|
|
#include "Luau/Config.h"
|
|
|
|
#include "Luau/Frontend.h"
|
|
|
|
|
|
|
|
#include "Fixture.h"
|
|
|
|
#include "ScopedFlags.h"
|
|
|
|
|
|
|
|
#include "doctest.h"
|
|
|
|
|
|
|
|
#include <iostream>
|
|
|
|
|
|
|
|
using namespace Luau;
|
|
|
|
|
|
|
|
TEST_SUITE_BEGIN("ConfigTest");
|
|
|
|
|
|
|
|
TEST_CASE("language_mode")
|
|
|
|
{
|
|
|
|
Config config;
|
|
|
|
auto err = parseConfig(R"({"languageMode":"strict"})", config);
|
|
|
|
REQUIRE(!err);
|
|
|
|
|
|
|
|
CHECK_EQ(int(Luau::Mode::Strict), int(config.mode));
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST_CASE("disable_a_lint_rule")
|
|
|
|
{
|
|
|
|
Config config;
|
2024-08-02 22:30:04 +08:00
|
|
|
auto err = parseConfig(
|
|
|
|
R"(
|
2021-10-30 04:25:12 +08:00
|
|
|
{"lint": {
|
|
|
|
"UnknownGlobal": false,
|
|
|
|
}}
|
|
|
|
)",
|
2024-08-02 22:30:04 +08:00
|
|
|
config
|
|
|
|
);
|
2021-10-30 04:25:12 +08:00
|
|
|
REQUIRE(!err);
|
|
|
|
|
|
|
|
CHECK(!config.enabledLint.isEnabled(LintWarning::Code_UnknownGlobal));
|
|
|
|
CHECK(config.enabledLint.isEnabled(LintWarning::Code_DeprecatedGlobal));
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST_CASE("report_a_syntax_error")
|
|
|
|
{
|
|
|
|
Config config;
|
2024-08-02 22:30:04 +08:00
|
|
|
auto err = parseConfig(
|
|
|
|
R"(
|
2021-10-30 04:25:12 +08:00
|
|
|
{"lint": {
|
|
|
|
"UnknownGlobal": "oops"
|
|
|
|
}}
|
|
|
|
)",
|
2024-08-02 22:30:04 +08:00
|
|
|
config
|
|
|
|
);
|
2021-10-30 04:25:12 +08:00
|
|
|
|
|
|
|
REQUIRE(err);
|
|
|
|
CHECK_EQ("In key UnknownGlobal: Bad setting 'oops'. Valid options are true and false", *err);
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST_CASE("noinfer_is_still_allowed")
|
|
|
|
{
|
|
|
|
Config config;
|
2024-11-09 05:41:45 +08:00
|
|
|
|
|
|
|
ConfigOptions opts;
|
|
|
|
opts.compat = true;
|
|
|
|
|
|
|
|
auto err = parseConfig(R"( {"language": {"mode": "noinfer"}} )", config, opts);
|
2021-10-30 04:25:12 +08:00
|
|
|
REQUIRE(!err);
|
|
|
|
|
|
|
|
CHECK_EQ(int(Luau::Mode::NoCheck), int(config.mode));
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST_CASE("lint_warnings_are_ordered")
|
|
|
|
{
|
|
|
|
Config root;
|
|
|
|
auto err = parseConfig(R"({"lint": {"*": true, "LocalShadow": false}})", root);
|
|
|
|
REQUIRE(!err);
|
|
|
|
|
|
|
|
Config foo = root;
|
|
|
|
err = parseConfig(R"({"lint": {"LocalShadow": true, "*": false}})", foo);
|
|
|
|
REQUIRE(!err);
|
|
|
|
|
|
|
|
CHECK(!root.enabledLint.isEnabled(LintWarning::Code_LocalShadow));
|
|
|
|
CHECK(root.enabledLint.isEnabled(LintWarning::Code_LocalUnused));
|
|
|
|
|
|
|
|
CHECK(!foo.enabledLint.isEnabled(LintWarning::Code_LocalShadow));
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST_CASE("comments")
|
|
|
|
{
|
|
|
|
Config config;
|
2024-08-02 22:30:04 +08:00
|
|
|
auto err = parseConfig(
|
|
|
|
R"(
|
2021-10-30 04:25:12 +08:00
|
|
|
{
|
|
|
|
"lint": {
|
|
|
|
"*": false,
|
|
|
|
"SameLineStatement": true,
|
|
|
|
"FunctionUnused": true,
|
|
|
|
//"LocalShadow": true,
|
|
|
|
//"LocalUnused": true,
|
|
|
|
"ImportUnused": true,
|
|
|
|
"ImplicitReturn": true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
)",
|
2024-08-02 22:30:04 +08:00
|
|
|
config
|
|
|
|
);
|
2021-10-30 04:25:12 +08:00
|
|
|
REQUIRE(!err);
|
|
|
|
|
|
|
|
CHECK(!config.enabledLint.isEnabled(LintWarning::Code_LocalShadow));
|
|
|
|
CHECK(config.enabledLint.isEnabled(LintWarning::Code_ImportUnused));
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST_CASE("issue_severity")
|
|
|
|
{
|
|
|
|
Config config;
|
|
|
|
CHECK(!config.lintErrors);
|
|
|
|
CHECK(config.typeErrors);
|
|
|
|
|
2024-08-02 22:30:04 +08:00
|
|
|
auto err = parseConfig(
|
|
|
|
R"(
|
2021-10-30 04:25:12 +08:00
|
|
|
{
|
|
|
|
"lintErrors": true,
|
|
|
|
"typeErrors": false,
|
|
|
|
}
|
|
|
|
)",
|
2024-08-02 22:30:04 +08:00
|
|
|
config
|
|
|
|
);
|
2021-10-30 04:25:12 +08:00
|
|
|
REQUIRE(!err);
|
|
|
|
|
|
|
|
CHECK(config.lintErrors);
|
|
|
|
CHECK(!config.typeErrors);
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST_CASE("extra_globals")
|
|
|
|
{
|
|
|
|
Config config;
|
2024-08-02 22:30:04 +08:00
|
|
|
auto err = parseConfig(
|
|
|
|
R"(
|
2021-10-30 04:25:12 +08:00
|
|
|
{
|
|
|
|
"globals": ["it", "__DEV__"],
|
|
|
|
}
|
|
|
|
)",
|
2024-08-02 22:30:04 +08:00
|
|
|
config
|
|
|
|
);
|
2021-10-30 04:25:12 +08:00
|
|
|
REQUIRE(!err);
|
|
|
|
|
|
|
|
REQUIRE(config.globals.size() == 2);
|
|
|
|
CHECK(config.globals[0] == "it");
|
|
|
|
CHECK(config.globals[1] == "__DEV__");
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST_CASE("lint_rules_compat")
|
|
|
|
{
|
|
|
|
Config config;
|
2024-11-09 05:41:45 +08:00
|
|
|
|
|
|
|
ConfigOptions opts;
|
|
|
|
opts.compat = true;
|
|
|
|
|
2024-08-02 22:30:04 +08:00
|
|
|
auto err = parseConfig(
|
|
|
|
R"(
|
2021-10-30 04:25:12 +08:00
|
|
|
{"lint": {
|
|
|
|
"SameLineStatement": "enabled",
|
|
|
|
"FunctionUnused": "disabled",
|
|
|
|
"ImportUnused": "fatal",
|
|
|
|
}}
|
|
|
|
)",
|
2024-08-02 22:30:04 +08:00
|
|
|
config,
|
2024-11-09 05:41:45 +08:00
|
|
|
opts
|
2024-08-02 22:30:04 +08:00
|
|
|
);
|
2021-10-30 04:25:12 +08:00
|
|
|
REQUIRE(!err);
|
|
|
|
|
|
|
|
CHECK(config.enabledLint.isEnabled(LintWarning::Code_SameLineStatement));
|
|
|
|
CHECK(!config.enabledLint.isEnabled(LintWarning::Code_FunctionUnused));
|
|
|
|
CHECK(config.enabledLint.isEnabled(LintWarning::Code_ImportUnused));
|
|
|
|
CHECK(config.fatalLint.isEnabled(LintWarning::Code_ImportUnused));
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST_SUITE_END();
|