From 367bcaba8a772dbe2190f49ff410e4f6cc1d0ed0 Mon Sep 17 00:00:00 2001 From: Matus Novak Date: Tue, 25 May 2021 18:18:54 +0200 Subject: [PATCH] Add a test with an example of usage of using derived methods from base classes --- tests/inheritance.cpp | 62 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/tests/inheritance.cpp b/tests/inheritance.cpp index 2315076b..e3f82a35 100644 --- a/tests/inheritance.cpp +++ b/tests/inheritance.cpp @@ -90,3 +90,65 @@ TEST_CASE("Inheritance with shared_ptr") { auto ptr = res.shared(); 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 factory(const std::string& name) { + if (name == "SomeDerivedClass") { + return std::make_shared(); + } + 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"); + cls.func<&SomeBaseClass::derivedMethod>("derivedMethod"); + } + + { // Register the derived class second, you must register the base methods as well! + auto& cls = m.klass("SomeDerivedClass"); + cls.ctor<>(); // Optional + cls.func<&SomeDerivedClass::derivedMethod>("derivedMethod"); + } + + { // Factory + auto& cls = m.klass("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()); +}