luau/tests/Config.test.cpp
Hunter Goldstein c799a548e4 Sync to version/652
> What's new?

* Fragment Autocomplete: a new API allows for type checking a small
  fragment of code against an existing file, significantly speeding up
  autocomplete performance in large files.

> New Solver

* E-Graphs have landed: this is an ongoing approach to make the new type solver
  simplify types in a more consistent and principled manner, based on
  similar work (e.g.: https://egraphs-good.github.io/).
* Adds support for exported / local user type functions.
* Fixes a set of bugs in which the new solver will fail to complete
  inference for simple expressions with just literals and operators.

> General

* It is now an explicit runtime error to `require` a path with a ".lua" or
  ".luau" extension, and the error message will suggest removing the extension.
  ```
  require("path/to/mymodule.lua")
  ```
* Fixes a bug in which whether two `Symbol`s are equal depends on
  whether the new solver is enabled.
2024-11-08 11:01:20 -08:00

178 lines
3.7 KiB
C++

// 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;
auto err = parseConfig(
R"(
{"lint": {
"UnknownGlobal": false,
}}
)",
config
);
REQUIRE(!err);
CHECK(!config.enabledLint.isEnabled(LintWarning::Code_UnknownGlobal));
CHECK(config.enabledLint.isEnabled(LintWarning::Code_DeprecatedGlobal));
}
TEST_CASE("report_a_syntax_error")
{
Config config;
auto err = parseConfig(
R"(
{"lint": {
"UnknownGlobal": "oops"
}}
)",
config
);
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;
ConfigOptions opts;
opts.compat = true;
auto err = parseConfig(R"( {"language": {"mode": "noinfer"}} )", config, opts);
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;
auto err = parseConfig(
R"(
{
"lint": {
"*": false,
"SameLineStatement": true,
"FunctionUnused": true,
//"LocalShadow": true,
//"LocalUnused": true,
"ImportUnused": true,
"ImplicitReturn": true
}
}
)",
config
);
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);
auto err = parseConfig(
R"(
{
"lintErrors": true,
"typeErrors": false,
}
)",
config
);
REQUIRE(!err);
CHECK(config.lintErrors);
CHECK(!config.typeErrors);
}
TEST_CASE("extra_globals")
{
Config config;
auto err = parseConfig(
R"(
{
"globals": ["it", "__DEV__"],
}
)",
config
);
REQUIRE(!err);
REQUIRE(config.globals.size() == 2);
CHECK(config.globals[0] == "it");
CHECK(config.globals[1] == "__DEV__");
}
TEST_CASE("lint_rules_compat")
{
Config config;
ConfigOptions opts;
opts.compat = true;
auto err = parseConfig(
R"(
{"lint": {
"SameLineStatement": "enabled",
"FunctionUnused": "disabled",
"ImportUnused": "fatal",
}}
)",
config,
opts
);
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();