It should describe a function with no params that returns void
1 void test() { } 2 3 auto result = describeCallable!test; 4 5 result.name.should.equal("test"); 6 result.type.name.should.equal("pure nothrow @nogc @safe void()"); 7 result.returns.name.should.equal("void"); 8 result.parameters.length.should.equal(0); 9 result.location.file.should.equal("source/introspection/callable.d"); 10 result.location.line.should.be.greaterThan(0); 11 result.location.column.should.equal(8);
It should describe a function with no params that returns ref int
1 int val = 0; 2 ref int test() { return val; } 3 4 auto result = describeCallable!test; 5 6 result.name.should.equal("test"); 7 result.type.name.should.equal("pure nothrow @nogc ref @safe int()"); 8 result.returns.name.should.equal("int"); 9 result.parameters.length.should.equal(0);
It should describe a function with a parameter without a default value
1 int val = 0; 2 ref int test(string a) { return val; } 3 4 auto result = describeCallable!test; 5 6 result.parameters.length.should.equal(1); 7 result.parameters[0].name.should.equal("a"); 8 result.parameters[0].type.name.should.equal("string"); 9 result.parameters[0].default_.value.should.equal(""); 10 result.parameters[0].default_.exists.should.equal(false);
It should describe a function with a parameter with a default value
1 int val = 0; 2 ref int test(string a = "test") { return val; } 3 4 auto result = describeCallable!test; 5 6 result.parameters.length.should.equal(1); 7 result.parameters[0].name.should.equal("a"); 8 result.parameters[0].type.name.should.equal("string"); 9 result.parameters[0].default_.value.should.equal(`"test"`); 10 result.parameters[0].default_.exists.should.equal(true); 11 12 result.parameters[0].isLazy.should.equal(false); 13 result.parameters[0].isScope.should.equal(false); 14 result.parameters[0].isOut.should.equal(false); 15 result.parameters[0].isRef.should.equal(false); 16 result.parameters[0].isReturn.should.equal(false);
It should describe a function attributes
1 int attr(int) { return 0; } 2 3 @("attribute1") @attr(1) 4 void test() { } 5 6 auto result = describeCallable!test; 7 8 result.attributes.length.should.equal(2); 9 result.attributes[0].name.should.equal(`"attribute1"`); 10 result.attributes[0].type.name.should.equal(`string`); 11 result.attributes[1].name.should.equal("0"); 12 result.attributes[1].type.name.should.equal(`int`);
It should find the parameter storage classes
1 void test(scope Object, out int, ref int, lazy int, return Object) { } 2 3 auto result = describeCallable!test; 4 5 result.parameters[0].isScope.should.equal(true); 6 result.parameters[1].isOut.should.equal(true); 7 result.parameters[2].isRef.should.equal(true); 8 result.parameters[3].isLazy.should.equal(true); 9 result.parameters[4].isReturn.should.equal(true);
Describes a callable