1#!/usr/bin/env python3
2# -*- coding: utf-8 -*-
3# This file is part of Xpra.
4# Copyright (C) 2014-2019 Antoine Martin <antoine@xpra.org>
5# Xpra is released under the terms of the GNU GPL v2, or, at your option, any
6# later version. See the file COPYING for details.
7
8import unittest
9
10try:
11    from xpra.rectangle import rectangle        #@UnresolvedImport
12
13    R1 = rectangle(0, 0, 20, 20)
14    R2 = rectangle(0, 0, 20, 20)
15    R3 = rectangle(0, 0, 40, 40)
16    R4 = rectangle(10, 10, 50, 50)
17    R5 = rectangle(100, 100, 100, 100)
18except ImportError:
19    rectangle, R1, R2, R3, R4, R5 = None, None, None, None, None, None
20
21
22class TestRegion(unittest.TestCase):
23
24    def test_eq(self):
25        assert R1==R2
26        assert R1!=R3
27        assert R2!=R3
28
29    def test_intersection(self):
30        r1 = rectangle(0, 0, 100, 100)
31        r2 = rectangle(50, 50, 200, 200)
32        i = r1.intersection_rect(r2)
33        assert i.x==50 and i.y==50 and i.width==50 and i.height==50
34        i2 = r2.intersection_rect(r1)
35        assert i2==i
36        r3 = rectangle(100, 100, 50, 50)
37        i = r2.intersection_rect(r3)
38        assert i==r3
39        r4 = rectangle(0, 0, 10, 10)
40        i = r3.intersection_rect(r4)
41        assert i is None
42
43    def test_contains(self):
44        assert R1.contains_rect(R2)
45        assert not R1.contains_rect(R3)
46        assert R3.contains_rect(R1)
47        assert not R1.contains_rect(R4)
48        assert not R1.contains_rect(R5)
49
50    def test_substract(self):
51        #  ##########          ##########
52        #  #        #          ##########
53        #  #        #          ##########
54        #  #        #          ##########
55        #  #   ##   #    ->                + ####  +  ####  +
56        #  #   ##   #                        ####     ####
57        #  #        #                                          ##########
58        #  #        #                                          ##########
59        #  #        #                                          ##########
60        #  ##########                                          ##########
61        r = rectangle(0, 0, 100, 100)
62        sub = rectangle(40, 40, 20, 20)
63        l = r.substract_rect(sub)
64        assert len(l)==4
65        #verify total area has not changed:
66        total = r.width*r.height
67        assert total == sum(r.width*r.height for r in l+[sub])
68        assert rectangle(0, 0, 100, 40) in l
69        assert rectangle(0, 40, 40, 20) in l
70        assert rectangle(0, 40, 40, 20) in l
71        # at (0,0)
72        # ##########
73        # #        #
74        # #        #
75        # #        #
76        # #        #         at (50, 50)
77        # #        #         ##########
78        # #        #         #        #
79        # #        #    -    #        #
80        # #        #         #        #
81        # ##########         #        #
82        #                    #        #
83        #                    #        #
84        #                    #        #
85        #                    #        #
86        #                    ##########
87        r = rectangle(0, 0, 100, 100)
88        sub = rectangle(50, 50, 100, 100)
89        l = r.substract_rect(sub)
90        assert len(l)==2
91        assert rectangle(0, 0, 100, 50) in l
92        assert rectangle(0, 50, 50, 50) in l
93        assert rectangle(200, 200, 0, 0) not in l
94
95
96def main():
97    #skip test if import failed (ie: not a server build)
98    if rectangle is not None:
99        unittest.main()
100    else:
101        print("no rectangle class, test skipped")
102
103if __name__ == '__main__':
104    main()
105