blob: 90a05c5cc866101385b9eecddec452aa66ef63df [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
#include "preextstl.h"
#include "gtest/gtest.h"
#include "postextstl.h"
#include <o3tl/range.hxx>
#include <vector>
#include <deque>
using o3tl::range;
using o3tl::make_range;
using o3tl::range_of;
using std::size_t;
class range_test : public ::testing::Test
{
public:
void int_test()
{
range<int>
t1(12,88);
range<int>
t2(33,33);
// ctor
ASSERT_TRUE(t1.begin() == 12) << "int ctor1";
ASSERT_TRUE(t1.end() == 88) << "int ctor2";
ASSERT_TRUE(t2.begin() == 33) << "int ctor3";
ASSERT_TRUE(t2.end() == 33) << "int ctor4";
// make_range
ASSERT_TRUE(make_range(0,8).begin() == 0) << "int make_range1";
ASSERT_TRUE(make_range(0,8).end() == 8) << "int make_range2";
// size
ASSERT_TRUE(t1.size() == size_t(t1.end() - t1.begin())) << "int size1";
ASSERT_TRUE(t2.size() == size_t(0)) << "int size2";
// contains
range<int> t3(0,10);
range<int> t4(7, 15);
range<int> t5(12, 12);
range<int> t6(13, 77);
range<int> t7(87, 87);
range<int> t8(87, 88);
range<int> t9(88, 88);
range<int> t10(33, 120);
range<int> t11(90, 100);
range<int> t12(200,200);
ASSERT_TRUE(t1.contains(t1)) << "int contains1";
ASSERT_TRUE(t1.contains(t2)) << "int contains2";
ASSERT_TRUE(! t1.contains(t3)) << "int contains3";
ASSERT_TRUE(! t1.contains(t4)) << "int contains4";
ASSERT_TRUE(t1.contains(t5)) << "int contains5";
ASSERT_TRUE(t1.contains(t6)) << "int contains6";
ASSERT_TRUE(t1.contains(t7)) << "int contains7";
ASSERT_TRUE(t1.contains(t8)) << "int contains8";
ASSERT_TRUE(! t1.contains(t9)) << "int contains9";
ASSERT_TRUE(! t1.contains(t10)) << "int contains10";
ASSERT_TRUE(! t1.contains(t11)) << "int contains11";
ASSERT_TRUE(! t1.contains(t12)) << "int contains12";
ASSERT_TRUE(t1.contains(50)) << "int contains n1";
ASSERT_TRUE(t1.contains(12)) << "int contains n2";
ASSERT_TRUE(t1.contains(87)) << "int contains n3";
ASSERT_TRUE(! t1.contains(3)) << "int contains n4";
ASSERT_TRUE(! t1.contains(11)) << "int contains n5";
ASSERT_TRUE(! t1.contains(88)) << "int contains n6";
ASSERT_TRUE(! t1.contains(100)) << "int contains n7";
// overlaps
range<int> t13(88,99);
ASSERT_TRUE(t1.overlaps(t1)) << "int overlaps1";
ASSERT_TRUE(t1.overlaps(t2)) << "int overlaps2";
ASSERT_TRUE(! t1.overlaps(t3)) << "int overlaps3";
ASSERT_TRUE(t1.overlaps(t4)) << "int overlaps4";
ASSERT_TRUE(t1.overlaps(t5)) << "int overlaps5";
ASSERT_TRUE(t1.overlaps(t6)) << "int overlaps6";
ASSERT_TRUE(t1.overlaps(t7)) << "int overlaps7";
ASSERT_TRUE(t1.overlaps(t8)) << "int overlaps8";
ASSERT_TRUE(! t1.overlaps(t9)) << "int overlaps9";
ASSERT_TRUE(t1.overlaps(t10)) << "int overlaps10";
ASSERT_TRUE(! t1.overlaps(t11)) << "int overlaps11";
ASSERT_TRUE(! t1.overlaps(t12)) << "int overlaps12";
ASSERT_TRUE(! t1.overlaps(t13)) << "int overlaps13";
// distance_to
ASSERT_TRUE(t1.distance_to(t13) == 0) << "int distance_to1";
ASSERT_TRUE(t1.distance_to(t9) == 0) << "int distance_to2";
ASSERT_TRUE(t1.distance_to(t11) == 2) << "int distance_to3";
ASSERT_TRUE(t1.distance_to(t8) == -1) << "int distance_to4";
ASSERT_TRUE(t1.distance_to(t3) == -88) << "int distance_to5";
}
void iterator_test()
{
typedef std::vector<char>::const_iterator test_it;
const std::vector<char> hv(200,'x');
test_it hit1 = hv.begin() + 12;
test_it hit2 = hv.begin() + 88;
range<test_it>
t1(hit1, hit2);
range<test_it>
t2(hv.begin()+33, hv.begin()+33);
// ctor
ASSERT_TRUE(t1.begin() == hit1) << "ivec ctor1";
ASSERT_TRUE(t1.end() == hit2) << "ivec ctor2";
ASSERT_TRUE(t2.begin() == hv.begin()+33) << "ivec ctor3";
ASSERT_TRUE(t2.end() == hv.begin()+33) << "ivec ctor4";
// make_range
ASSERT_TRUE(make_range(hv.begin(), hv.begin()+8).begin() == hv.begin()) << "ivec make_range1";
ASSERT_TRUE(make_range(hv.begin(), hv.begin()+8).end() == hv.begin()+8) << "ivec make_range2";
// size
ASSERT_TRUE(t1.size() == size_t(t1.end() - t1.begin())) << "ivec size1";
ASSERT_TRUE(t2.size() == size_t(0)) << "ivec size2";
// contains
range<test_it> t3(hv.begin(), hv.begin() + 10);
range<test_it> t4(hv.begin() + 7, hv.begin() + 15);
range<test_it> t5(hit1, hit1);
range<test_it> t6(hv.begin() + 13, hv.begin() + 77);
range<test_it> t7(hv.begin() + 87, hv.begin() + 87);
range<test_it> t8(hv.begin() + 87, hit2);
range<test_it> t9(hit2, hit2);
range<test_it> t10(hv.begin() + 33, hv.begin() + 120);
range<test_it> t11(hv.begin() + 90, hv.begin() + 100);
range<test_it> t12(hv.begin() + 200,hv.begin() + 200);
ASSERT_TRUE(t1.contains(t1)) << "ivec contains1";
ASSERT_TRUE(t1.contains(t2)) << "ivec contains2";
ASSERT_TRUE(! t1.contains(t3)) << "ivec contains3";
ASSERT_TRUE(! t1.contains(t4)) << "ivec contains4";
ASSERT_TRUE(t1.contains(t5)) << "ivec contains5";
ASSERT_TRUE(t1.contains(t6)) << "ivec contains6";
ASSERT_TRUE(t1.contains(t7)) << "ivec contains7";
ASSERT_TRUE(t1.contains(t8)) << "ivec contains8";
ASSERT_TRUE(! t1.contains(t9)) << "ivec contains9";
ASSERT_TRUE(! t1.contains(t10)) << "ivec contains10";
ASSERT_TRUE(! t1.contains(t11)) << "ivec contains11";
ASSERT_TRUE(! t1.contains(t12)) << "ivec contains12";
ASSERT_TRUE(t1.contains(hv.begin() + 50)) << "ivec contains n1";
ASSERT_TRUE(t1.contains(hit1)) << "ivec contains n2";
ASSERT_TRUE(t1.contains(hv.begin() + 87)) << "ivec contains n3";
ASSERT_TRUE(! t1.contains(hv.begin() + 3)) << "ivec contains n4";
ASSERT_TRUE(! t1.contains(hv.begin() + 11)) << "ivec contains n5";
ASSERT_TRUE(! t1.contains(hit2)) << "ivec contains n6";
ASSERT_TRUE(! t1.contains(hv.begin() + 100)) << "ivec contains n7";
// overlaps
range<test_it> t13(hit2, hv.begin() + 99);
ASSERT_TRUE(t1.overlaps(t1)) << "ivec overlaps1";
ASSERT_TRUE(t1.overlaps(t2)) << "ivec overlaps2";
ASSERT_TRUE(! t1.overlaps(t3)) << "ivec overlaps3";
ASSERT_TRUE(t1.overlaps(t4)) << "ivec overlaps4";
ASSERT_TRUE(t1.overlaps(t5)) << "ivec overlaps5";
ASSERT_TRUE(t1.overlaps(t6)) << "ivec overlaps6";
ASSERT_TRUE(t1.overlaps(t7)) << "ivec overlaps7";
ASSERT_TRUE(t1.overlaps(t8)) << "ivec overlaps8";
ASSERT_TRUE(! t1.overlaps(t9)) << "ivec overlaps9";
ASSERT_TRUE(t1.overlaps(t10)) << "ivec overlaps10";
ASSERT_TRUE(! t1.overlaps(t11)) << "ivec overlaps11";
ASSERT_TRUE(! t1.overlaps(t12)) << "ivec overlaps12";
ASSERT_TRUE(! t1.overlaps(t13)) << "ivec overlaps13";
// distance_to
ASSERT_TRUE(t1.distance_to(t13) == 0) << "ivec distance_to1";
ASSERT_TRUE(t1.distance_to(t8) == -1) << "ivec distance_to2";
ASSERT_TRUE(t1.distance_to(t9) == 0) << "ivec distance_to3";
ASSERT_TRUE(t1.distance_to(t11) == 2) << "ivec distance_to4";
ASSERT_TRUE(t1.distance_to(t3) == -88) << "ivec distance_to5";
const std::vector< int* > h2(20, (int*)0);
std::deque< double > h3(30, 0.0);
ASSERT_TRUE(range_of(h2).begin() == h2.begin()) << "range_of1";
ASSERT_TRUE(range_of(h3).end() == h3.end()) << "range_of2";
}
}; // class range_test
TEST_F(range_test, global)
{
int_test();
iterator_test();
}