test/test_Iterator.cpp in rice-4.0.4 vs test/test_Iterator.cpp in rice-4.1.0

- old
+ new

@@ -53,10 +53,15 @@ namespace { struct Data { + Data(uint32_t value) + { + this->index = value; + } + uint32_t index; }; class ContainerValues { @@ -74,10 +79,20 @@ std::vector<Data>::iterator end() { return this->data_.end(); } + std::vector<Data>::const_iterator cbegin() const + { + return this->data_.cbegin(); + } + + std::vector<Data>::const_iterator cend() const + { + return this->data_.cend(); + } + std::vector<Data> data_; }; class ContainerPointers { @@ -103,10 +118,20 @@ std::vector<Data*>::iterator end() { return this->data_.end(); } + std::vector<Data*>::reverse_iterator rbegin() + { + return this->data_.rbegin(); + } + + std::vector<Data*>::reverse_iterator rend() + { + return this->data_.rend(); + } + std::vector<Data*> data_; }; } template <> @@ -142,20 +167,124 @@ ASSERT_EQUAL(Object(detail::to_ruby(1)), a[0]); ASSERT_EQUAL(Object(detail::to_ruby(2)), a[1]); ASSERT_EQUAL(Object(detail::to_ruby(3)), a[2]); } +TESTCASE(const_iterator_value) +{ + define_class<ContainerValues>("ContainerValues") + .define_constructor(Constructor<ContainerValues>()) + .define_iterator(&ContainerValues::cbegin, &ContainerValues::cend); + + Module m = define_module("TestingModule"); + + std::string code = R"(result = [] + container = ContainerValues.new + container.each do |x| + result << x + end + result)"; + + Array result = m.module_eval(code); + + ASSERT_EQUAL(3u, result.size()); + ASSERT_EQUAL(Object(detail::to_ruby(1)), result[0]); + ASSERT_EQUAL(Object(detail::to_ruby(2)), result[1]); + ASSERT_EQUAL(Object(detail::to_ruby(3)), result[2]); +} + TESTCASE(iterator_pointer) { define_class<ContainerPointers>("ContainerPointers") .define_constructor(Constructor<ContainerPointers>()) .define_iterator(&ContainerPointers::begin, &ContainerPointers::end); ContainerPointers* container = new ContainerPointers(); Object wrapper = Data_Object<ContainerPointers>(container); - Array a = wrapper.instance_eval("a = []; each() { |x| a << x }; a"); - ASSERT_EQUAL(3u, a.size()); - ASSERT_EQUAL(Object(detail::to_ruby(1)), a[0]); - ASSERT_EQUAL(Object(detail::to_ruby(2)), a[1]); - ASSERT_EQUAL(Object(detail::to_ruby(3)), a[2]); + Module m = define_module("TestingModule"); + + std::string code = R"(result = [] + container = ContainerPointers.new + container.each do |x| + result << x + end + result)"; + + Array result = m.module_eval(code); + + ASSERT_EQUAL(3u, result.size()); + ASSERT_EQUAL(Object(detail::to_ruby(1)), result[0]); + ASSERT_EQUAL(Object(detail::to_ruby(2)), result[1]); + ASSERT_EQUAL(Object(detail::to_ruby(3)), result[2]); } + +TESTCASE(two_iterator_pointer) +{ + define_class<ContainerPointers>("ContainerPointers") + .define_constructor(Constructor<ContainerPointers>()) + .define_iterator(&ContainerPointers::begin, &ContainerPointers::end) + .define_iterator(&ContainerPointers::rbegin, &ContainerPointers::rend, "reach"); + + ContainerPointers* container = new ContainerPointers(); + Object wrapper = Data_Object<ContainerPointers>(container); + + Module m = define_module("TestingModule"); + + std::string code = R"(result = [] + container = ContainerPointers.new + container.each do |x| + result << x + end + container.reach do |x| + result << x + end + result)"; + + Array result = m.module_eval(code); + + ASSERT_EQUAL(6u, result.size()); + ASSERT_EQUAL(Object(detail::to_ruby(1)), result[0]); + ASSERT_EQUAL(Object(detail::to_ruby(2)), result[1]); + ASSERT_EQUAL(Object(detail::to_ruby(3)), result[2]); + ASSERT_EQUAL(Object(detail::to_ruby(3)), result[3]); + ASSERT_EQUAL(Object(detail::to_ruby(2)), result[4]); + ASSERT_EQUAL(Object(detail::to_ruby(1)), result[5]); +} + +TESTCASE(map) +{ + define_class<ContainerPointers>("ContainerPointers") + .define_constructor(Constructor<ContainerPointers>()) + .define_iterator(&ContainerPointers::begin, &ContainerPointers::end); + + Module m = define_module("Testing"); + + std::string code = R"(container = ContainerPointers.new + container.map do |x| + x * 2 + end)"; + + Array result = m.module_eval(code); + + ASSERT_EQUAL(3u, result.size()); + ASSERT_EQUAL(Object(detail::to_ruby(2)), result[0]); + ASSERT_EQUAL(Object(detail::to_ruby(4)), result[1]); + ASSERT_EQUAL(Object(detail::to_ruby(6)), result[2]); +} + +TESTCASE(to_enum) +{ + Module m = define_module("TestingModule"); + + std::string code = R"(container = ContainerPointers.new + container.each.map do |x| + x * 2 + end)"; + + Array result = m.module_eval(code); + + ASSERT_EQUAL(3u, result.size()); + ASSERT_EQUAL(Object(detail::to_ruby(2)), result[0]); + ASSERT_EQUAL(Object(detail::to_ruby(4)), result[1]); + ASSERT_EQUAL(Object(detail::to_ruby(6)), result[2]); +} \ No newline at end of file