Skip to content

Commit

Permalink
Add a test with an example of usage of using derived methods from bas…
Browse files Browse the repository at this point in the history
…e classes
  • Loading branch information
matusnovak committed May 25, 2021
1 parent 0dfae3d commit 367bcab
Showing 1 changed file with 62 additions and 0 deletions.
62 changes: 62 additions & 0 deletions tests/inheritance.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -90,3 +90,65 @@ TEST_CASE("Inheritance with shared_ptr") {
auto ptr = res.shared<BaseClass>();
REQUIRE(ptr->getStuff() == "Hello World!");
}

class SomeBaseClass {
public:
virtual ~SomeBaseClass() = default;

virtual void derivedMethod() = 0;
};

class SomeDerivedClass : public SomeBaseClass {
public:
void derivedMethod() override {
std::cout << "SomeDerivedClass::derivedMethod() called!" << std::endl;
}
};

class SomeBaseFactory {
public:
std::shared_ptr<SomeBaseClass> factory(const std::string& name) {
if (name == "SomeDerivedClass") {
return std::make_shared<SomeDerivedClass>();
}
throw std::runtime_error("No such class");
}
};

TEST_CASE("Derived method with shared_ptr") {
wren::VM vm;
auto& m = vm.module("test");

{ // Register the base class first
auto& cls = m.klass<SomeBaseClass>("SomeBaseClass");
cls.func<&SomeBaseClass::derivedMethod>("derivedMethod");
}

{ // Register the derived class second, you must register the base methods as well!
auto& cls = m.klass<SomeDerivedClass, SomeBaseClass>("SomeDerivedClass");
cls.ctor<>(); // Optional
cls.func<&SomeDerivedClass::derivedMethod>("derivedMethod");
}

{ // Factory
auto& cls = m.klass<SomeBaseFactory>("SomeBaseFactory");
cls.ctor<>();
cls.func<&SomeBaseFactory::factory>("factory");
}

const std::string code = R"(
import "test" for SomeBaseFactory
class Main {
static main() {
var factory = SomeBaseFactory.new()
var instance = factory.factory("SomeDerivedClass")
instance.derivedMethod()
}
}
)";

vm.runFromSource("main", code);
auto main = vm.find("main", "Main").func("main()");
REQUIRE_NOTHROW(main());
}

0 comments on commit 367bcab

Please sign in to comment.