mirror of
https://github.com/logos-co/logos-cpp-sdk.git
synced 2026-08-31 09:41:06 +00:00
* add IDL parser & generator (wip) * fix fixtures issues affecting tests * fix fixtures issues affecting tests
149 lines
3.4 KiB
C++
149 lines
3.4 KiB
C++
#include <gtest/gtest.h>
|
|
#include "lidl_validator.h"
|
|
|
|
static ModuleDecl makeModule(const QString& name)
|
|
{
|
|
ModuleDecl m;
|
|
m.name = name;
|
|
return m;
|
|
}
|
|
|
|
TEST(LidlValidator, ValidEmptyModule)
|
|
{
|
|
auto r = lidlValidate(makeModule("test"));
|
|
EXPECT_FALSE(r.hasErrors());
|
|
}
|
|
|
|
TEST(LidlValidator, EmptyModuleName)
|
|
{
|
|
auto r = lidlValidate(makeModule(""));
|
|
EXPECT_TRUE(r.hasErrors());
|
|
EXPECT_TRUE(r.errors[0].contains("empty"));
|
|
}
|
|
|
|
TEST(LidlValidator, DuplicateMethodNames)
|
|
{
|
|
ModuleDecl m = makeModule("test");
|
|
MethodDecl md;
|
|
md.name = "doThing";
|
|
md.returnType = { TypeExpr::Primitive, "tstr", {} };
|
|
m.methods.append(md);
|
|
m.methods.append(md);
|
|
|
|
auto r = lidlValidate(m);
|
|
EXPECT_TRUE(r.hasErrors());
|
|
EXPECT_TRUE(r.errors[0].contains("Duplicate method"));
|
|
}
|
|
|
|
TEST(LidlValidator, DuplicateEventNames)
|
|
{
|
|
ModuleDecl m = makeModule("test");
|
|
EventDecl ed;
|
|
ed.name = "onUpdate";
|
|
m.events.append(ed);
|
|
m.events.append(ed);
|
|
|
|
auto r = lidlValidate(m);
|
|
EXPECT_TRUE(r.hasErrors());
|
|
EXPECT_TRUE(r.errors[0].contains("Duplicate event"));
|
|
}
|
|
|
|
TEST(LidlValidator, DuplicateTypeNames)
|
|
{
|
|
ModuleDecl m = makeModule("test");
|
|
TypeDecl td;
|
|
td.name = "MyType";
|
|
m.types.append(td);
|
|
m.types.append(td);
|
|
|
|
auto r = lidlValidate(m);
|
|
EXPECT_TRUE(r.hasErrors());
|
|
EXPECT_TRUE(r.errors[0].contains("Duplicate type"));
|
|
}
|
|
|
|
TEST(LidlValidator, TypeShadowsBuiltin)
|
|
{
|
|
ModuleDecl m = makeModule("test");
|
|
TypeDecl td;
|
|
td.name = "tstr";
|
|
m.types.append(td);
|
|
|
|
auto r = lidlValidate(m);
|
|
EXPECT_TRUE(r.hasErrors());
|
|
EXPECT_TRUE(r.errors[0].contains("shadows"));
|
|
}
|
|
|
|
TEST(LidlValidator, UnknownNamedType)
|
|
{
|
|
ModuleDecl m = makeModule("test");
|
|
MethodDecl md;
|
|
md.name = "foo";
|
|
md.returnType = { TypeExpr::Named, "NonExistentType", {} };
|
|
m.methods.append(md);
|
|
|
|
auto r = lidlValidate(m);
|
|
EXPECT_TRUE(r.hasErrors());
|
|
EXPECT_TRUE(r.errors[0].contains("Unknown type"));
|
|
}
|
|
|
|
TEST(LidlValidator, ValidNamedType)
|
|
{
|
|
ModuleDecl m = makeModule("test");
|
|
TypeDecl td;
|
|
td.name = "MyStruct";
|
|
m.types.append(td);
|
|
|
|
MethodDecl md;
|
|
md.name = "foo";
|
|
md.returnType = { TypeExpr::Named, "MyStruct", {} };
|
|
m.methods.append(md);
|
|
|
|
auto r = lidlValidate(m);
|
|
EXPECT_FALSE(r.hasErrors());
|
|
}
|
|
|
|
TEST(LidlValidator, DuplicateParamNames)
|
|
{
|
|
ModuleDecl m = makeModule("test");
|
|
MethodDecl md;
|
|
md.name = "foo";
|
|
md.returnType = { TypeExpr::Primitive, "tstr", {} };
|
|
ParamDecl p;
|
|
p.name = "arg";
|
|
p.type = { TypeExpr::Primitive, "tstr", {} };
|
|
md.params.append(p);
|
|
md.params.append(p);
|
|
m.methods.append(md);
|
|
|
|
auto r = lidlValidate(m);
|
|
EXPECT_TRUE(r.hasErrors());
|
|
EXPECT_TRUE(r.errors[0].contains("Duplicate parameter"));
|
|
}
|
|
|
|
TEST(LidlValidator, NestedArrayTypeValid)
|
|
{
|
|
ModuleDecl m = makeModule("test");
|
|
MethodDecl md;
|
|
md.name = "foo";
|
|
TypeExpr elem = { TypeExpr::Primitive, "tstr", {} };
|
|
md.returnType = { TypeExpr::Array, "", { elem } };
|
|
m.methods.append(md);
|
|
|
|
auto r = lidlValidate(m);
|
|
EXPECT_FALSE(r.hasErrors());
|
|
}
|
|
|
|
TEST(LidlValidator, MapWithUnknownValueType)
|
|
{
|
|
ModuleDecl m = makeModule("test");
|
|
MethodDecl md;
|
|
md.name = "foo";
|
|
TypeExpr key = { TypeExpr::Primitive, "tstr", {} };
|
|
TypeExpr val = { TypeExpr::Named, "Missing", {} };
|
|
md.returnType = { TypeExpr::Map, "", { key, val } };
|
|
m.methods.append(md);
|
|
|
|
auto r = lidlValidate(m);
|
|
EXPECT_TRUE(r.hasErrors());
|
|
}
|