• Layer.cpp
  • #define CATCH_CONFIG_MAIN
    #include <catch.h>
    
    #undef TEST
    
    #include <Gorgon/Main.h>
    #include <Gorgon/Layer.h>
    #include <Gorgon/Window.h>
    #include <Gorgon/Graphics/Layer.h>
    #include <Gorgon/Audio.h>
    #include <Gorgon/Input/Layer.h>
    
    using namespace Gorgon;
    using namespace Gorgon::Geometry;
    
    /*TEST_CASE("Layer base", "[Layer]") {
    
    	//Initialize("Unittestlayer");
    
    
    	Layer l1;
    
    	l1.Resize(200, 300);
    
    	REQUIRE(l1.GetWidth() == 200);
    
    	REQUIRE(l1.GetHeight() == 300);
    
    	REQUIRE(l1.GetSize() == Size(200, 300));
    
    	REQUIRE(l1.GetLeft() == 0);
    
    	REQUIRE(l1.GetTop() == 0);
    
    	REQUIRE(l1.GetLocation() == Point(0, 0));
    
    	REQUIRE(l1.GetEffectiveBounds() == Bounds(0, 0, 200, 300));
    
    
    
    	Layer l2;
    
    	REQUIRE(l1.Children.GetCount() == 0);
    
    	l1.Add(l2);
    
    	REQUIRE(l1.Children.GetCount() == 1);
    
    	REQUIRE(l2.GetSize() == Size(0, 0));
    
    	REQUIRE(l2.GetEffectiveBounds() == Bounds(0, 0, 200, 300));
    
    	l1.Move(10, 15);
    
    	REQUIRE(l1.GetEffectiveBounds() == Bounds(10, 15, 210, 315));
    
    	REQUIRE(l2.GetEffectiveBounds() == Bounds(0, 0, 200, 300));
    
    	l2.Move(20, 25);
    
    	REQUIRE(l2.GetEffectiveBounds() == Bounds(20, 25, 200, 300));
    
    	l2.Resize(40, 50);
    
    	REQUIRE(l2.GetEffectiveBounds() == Bounds(20, 25, 60, 75));
    
    	REQUIRE(l2.GetEffectiveBounds().GetSize() == Size(40, 50));
    
    
    
    	Layer l3;
    
    	l1.Add(l3);
    
    	l3.Resize(60, 70);
    
    	REQUIRE(l3.GetEffectiveBounds() == Bounds(0, 0, 60, 70));
    
    	l3.Move(30, 35);
    
    	REQUIRE(l3.GetEffectiveBounds() == Bounds(30, 35, 90, 105));
    
    	REQUIRE(l3.GetOrder() == 1);
    }
    
    TEST_CASE("Graphics layer", "[Layer]") {
    
    	//Initialize("Unittestlayer");
    
    
    	Graphics::Layer l1;
    
    	l1.Resize(200, 300);
    
    	REQUIRE(l1.GetWidth() == 200);
    
    	REQUIRE(l1.GetHeight() == 300);
    
    	REQUIRE(l1.GetSize() == Size(200, 300));
    
    	REQUIRE(l1.GetTargetSize() == Size(200, 300));
    
    	REQUIRE(l1.GetLeft() == 0);
    
    	REQUIRE(l1.GetTop() == 0);
    
    	REQUIRE(l1.GetLocation() == Point(0, 0));
    
    	REQUIRE(l1.GetEffectiveBounds() == Bounds(0, 0, 200, 300));
    
    
    
    	Graphics::Layer l2;
    
    	REQUIRE(l1.Children.GetCount() == 0);
    
    	l1.Add(l2);
    
    	REQUIRE(l1.Children.GetCount() == 1);
    
    	REQUIRE(l2.GetSize() == Size(0, 0));
    
    	REQUIRE(l2.GetEffectiveBounds() == Bounds(0, 0, 200, 300));
    
    	REQUIRE(l2.GetTargetSize() == Size(200, 300));
    
    	l1.Move(10, 15);
    
    	REQUIRE(l1.GetEffectiveBounds() == Bounds(10, 15, 210, 315));
    
    	REQUIRE(l2.GetEffectiveBounds() == Bounds(0, 0, 200, 300));
    
    	l2.Move(20, 25);
    
    	REQUIRE(l2.GetEffectiveBounds() == Bounds(20, 25, 200, 300));
    
    	REQUIRE(l2.GetTargetSize() == Size(180, 275));
    
    	l2.Resize(40, 50);
    
    	REQUIRE(l2.GetEffectiveBounds() == Bounds(20, 25, 60, 75));
    
    	REQUIRE(l2.GetEffectiveBounds().GetSize() == Size(40, 50));
    
    	REQUIRE(l2.GetTargetSize() == Size(40, 50));
    
    
    
    	Graphics::Layer l3;
    
    	l1.Add(l3);
    
    	l3.Resize(60, 70);
    
    	REQUIRE(l3.GetEffectiveBounds() == Bounds(0, 0, 60, 70));
    
    	l3.Move(30, 35);
    
    	REQUIRE(l3.GetEffectiveBounds() == Bounds(30, 35, 90, 105));
    
    	REQUIRE(l3.GetOrder() == 1);
    
    	REQUIRE(l3.GetTargetSize() == Size(60, 70));
    
    	Layer l4;
    
    	l1.Insert(l4, 1);
    
    	REQUIRE(l4.GetOrder() == 1);
    }
    
    TEST_CASE("Window", "[Layer]") {
    
    	Initialize("Unittestlayer");
    
    	Window l1({200, 300}, "Test");
    
    	REQUIRE(l1.GetWidth() == 200);
    
    	REQUIRE(l1.GetHeight() == 300);
    
    	REQUIRE(l1.GetSize() == Size(200, 300));
    
    	REQUIRE(l1.GetLeft() == 0);
    
    	REQUIRE(l1.GetTop() == 0);
    
    	REQUIRE(l1.GetLocation() == Point(0, 0));
    
    	REQUIRE(l1.GetEffectiveBounds() == Bounds(0, 0, 200, 300));
    
    	l1.Move(150, 100);
        
    #ifdef X11
        //wait a little
        for(auto i=0; i<10; i++) {
            NextFrame();
            usleep(5000);
        }
    #endif
    
        //Window manager might reposition the window as it wants,
        //but should get it close to where we want.
    	REQUIRE(l1.GetPosition().Distance(Point(150, 100)) < 20);
    
    	//moving window should not move it as a layer, window (0,0) is always
    	//the start of the window layer.
    	REQUIRE(l1.GetLocation() == Point(0, 0));
    
    
    
    	Graphics::Layer l2;
    
    	l1.Add(l2);
    
    	REQUIRE(l2.GetSize() == Size(0, 0));
    
    	REQUIRE(l2.GetEffectiveBounds() == Bounds(0, 0, 200, 300));
    
    	REQUIRE(l2.GetTargetSize() == Size(200, 300));
    
    	REQUIRE(l2.GetEffectiveBounds() == Bounds(0, 0, 200, 300));
    
    	l2.Move(20, 25);
    
    	REQUIRE(l2.GetEffectiveBounds() == Bounds(20, 25, 200, 300));
    
    	REQUIRE(l2.GetTargetSize() == Size(180, 275));
    
    	l2.Resize(40, 50);
    
    	REQUIRE(l2.GetEffectiveBounds() == Bounds(20, 25, 60, 75));
    
    	REQUIRE(l2.GetEffectiveBounds().GetSize() == Size(40, 50));
    
    	REQUIRE(l2.GetTargetSize() == Size(40, 50));
    
    
    
    	Graphics::Layer l3;
    
    	l1.Add(l3);
    
    	l3.Resize(60, 70);
    
    	REQUIRE(l3.GetEffectiveBounds() == Bounds(0, 0, 60, 70));
    
    	l3.Move(30, 35);
    
    	REQUIRE(l3.GetEffectiveBounds() == Bounds(30, 35, 90, 105));
    
    	REQUIRE(l3.GetOrder() == 1);
    
    	REQUIRE(l3.GetTargetSize() == Size(60, 70));
    
    	Layer l4;
    
    	l1.Insert(l4, 1);
    
    	REQUIRE(l4.GetOrder() == 1);
    }
    
    
    TEST_CASE("Input", "[Layer]") {
        
        //Initialize("Unittestlayer");
        
        
        INFO("Make sure the mouse is out of the window frame.");
    
        int a = 0, b = 0;
        Geometry::Point t1, t2;
        Input::Mouse::Button tbtn;
        Window l1({200, 300}, "Test");
        
        MouseHandler m;
        Clip = l1.GetBounds();
        REQUIRE_FALSE(l1.propagate_mouseevent(Input::Mouse::EventType::Click, {10, 10}, Input::Mouse::Button::Left, 1, m));
        
        Input::Layer l2;
        l2.SetClick([&] (auto &l, auto pnt, auto btn) {
            if(pnt != t1) {
                Utils::ASSERT_FALSE("", 1, 10);
            }
            REQUIRE(pnt == t1);
            REQUIRE(btn == tbtn);
            a++;
            
            return true;
        });
        
        l1.Add(l2);
        
        tbtn = Input::Mouse::Button::Left;
        t1 = {10, 10};
        
        m.Clear();
        Clip = l1.GetBounds();
        (l1.propagate_mouseevent(Input::Mouse::EventType::HitCheck, {10, 10}, tbtn, 1, m));
        m.Clear();
        Clip = l1.GetBounds();
        REQUIRE(l1.propagate_mouseevent(Input::Mouse::EventType::Click, {10, 10}, tbtn, 1, m));
        REQUIRE(a == 1);
        
        l2.Move(10, 10);
        
        tbtn = Input::Mouse::Button::Left;
        t1 = {0, 0};
        
        m.Clear();
        Clip = l1.GetBounds();
        (l1.propagate_mouseevent(Input::Mouse::EventType::HitCheck, {10, 10}, tbtn, 1, m));
        Clip = l1.GetBounds();
        REQUIRE(l1.propagate_mouseevent(Input::Mouse::EventType::Click, {10, 10}, tbtn, 1, m));
        REQUIRE(a == 2);
        
        l2.Move(-10, -10);
        
        tbtn = Input::Mouse::Button::Left;
        t1 = {20, 20};
        
        m.Clear();
        Clip = l1.GetBounds();
        (l1.propagate_mouseevent(Input::Mouse::EventType::HitCheck, {10, 10}, tbtn, 1, m));
        Clip = l1.GetBounds();
        REQUIRE(l1.propagate_mouseevent(Input::Mouse::EventType::Click, {10, 10}, tbtn, 1, m));
        REQUIRE(a == 3);
        
        l2.Resize(20, 20);
        l2.Move(-10, -10);
        
        tbtn = Input::Mouse::Button::Left;
        t1 = {15, 15};
        
        m.Clear();
        Clip = l1.GetBounds();
        (l1.propagate_mouseevent(Input::Mouse::EventType::HitCheck, {5, 5}, tbtn, 1, m));
        Clip = l1.GetBounds();
        REQUIRE(l1.propagate_mouseevent(Input::Mouse::EventType::Click, {5, 5}, tbtn, 1, m));
        REQUIRE(a == 4);
        
        m.Clear();
        Clip = l1.GetBounds();
        (l1.propagate_mouseevent(Input::Mouse::EventType::HitCheck, {11, 11}, tbtn, 1, m));
        Clip = l1.GetBounds();
        REQUIRE_FALSE(l1.propagate_mouseevent(Input::Mouse::EventType::Click, {11, 11}, tbtn, 1, m));
        REQUIRE(a == 4);
        
        l2.Move(0, 290);
        
        m.Clear();
        Clip = l1.GetBounds();
        (l1.propagate_mouseevent(Input::Mouse::EventType::HitCheck, {10, 301}, tbtn, 1, m));
        Clip = l1.GetBounds();
        REQUIRE_FALSE(l1.propagate_mouseevent(Input::Mouse::EventType::Click, {10, 301}, tbtn, 1, m));
        REQUIRE(a == 4);
        
    }
    */