dmd/compiler/test/unit/objc/protocols/diagnostic_messages.d
2025-01-26 14:06:14 +01:00

72 lines
1.9 KiB
D

// See ../../../README.md for information about DMD unit tests.
/// Test cases for diagnostic messages on Objective-C protocols
module objc.protocols.diagnostic_messages;
version (D_ObjectiveC):
import dmd.location;
import support : afterEach, beforeEach, compiles, stripDelimited, Diagnostic;
@beforeEach initializeFrontend()
{
import dmd.frontend : initDMD;
initDMD();
}
@afterEach deinitializeFrontend()
{
import dmd.frontend : deinitializeDMD;
deinitializeDMD();
}
@("when a static interface method is not implemented")
@("it should report an error")
@("the error message should include that the method is a static method")
@("the error message should _not_ include the name of the metaclass")
unittest
{
enum filename = "test.d";
enum code = q{
extern (Objective-C)
interface Foo
{
static void foo();
}
extern (Objective-C)
class Bar : Foo { }
}.stripDelimited;
enum message = "Error: class test.Bar interface function extern (Objective-C) static void foo() is not implemented";
auto expected = Diagnostic(SourceLoc(filename, 8, 1), message);
const diagnostics = compiles(code, filename);
assert(diagnostics == [expected], "\n" ~ diagnostics.toString);
}
@("when a static interface method has a body")
@("it should report an error")
unittest
{
enum filename = "test.d";
enum code = q{
extern (Objective-C)
interface Foo
{
static void foo() { }
}
extern (Objective-C)
class Bar : Foo { }
}.stripDelimited;
enum message = "Error: function test.Foo.foo function body only allowed in final functions in interface Foo";
auto expected = Diagnostic(SourceLoc(filename, 4, 17), message);
const diagnostics = compiles(code, filename);
assert(diagnostics == [expected], "\n" ~ diagnostics.toString);
}