12
12
13
13
/* Helper functions */
14
14
15
+ /* !
16
+ * \brief Private helper to check SDL_FRect equality
17
+ */
18
+ static SDL_bool IsFRectEqual (const SDL_FRect * r1 , const SDL_FRect * r2 ) {
19
+ static const float MAX_DELTA = 1e-5f ;
20
+ SDL_FRect delta ;
21
+ delta .x = r1 -> x - r2 -> x ;
22
+ delta .y = r1 -> y - r2 -> y ;
23
+ delta .w = r1 -> w - r2 -> w ;
24
+ delta .h = r1 -> h - r2 -> h ;
25
+
26
+ return - MAX_DELTA <= delta .x && delta .x <= MAX_DELTA
27
+ && - MAX_DELTA <= delta .y && delta .y <= MAX_DELTA
28
+ && - MAX_DELTA <= delta .w && delta .w <= MAX_DELTA
29
+ && - MAX_DELTA <= delta .w && delta .h <= MAX_DELTA ;
30
+ }
31
+
32
+ /* !
33
+ * \brief Private helper to check SDL_FPoint equality
34
+ */
35
+ static SDL_bool IsFPointEqual (const SDL_FPoint * p1 , const SDL_FPoint * p2 ) {
36
+ static const float MAX_DELTA = 1e-5f ;
37
+ SDL_FPoint delta ;
38
+ delta .x = p1 -> x - p2 -> x ;
39
+ delta .y = p1 -> y - p2 -> y ;
40
+
41
+ return - MAX_DELTA <= delta .x && delta .x <= MAX_DELTA
42
+ && - MAX_DELTA <= delta .y && delta .y <= MAX_DELTA ;
43
+ }
44
+
45
+ /* Helper functions */
46
+
15
47
/* !
16
48
* \brief Private helper to check SDL_IntersectRectAndLine results
17
49
*/
@@ -1698,6 +1730,226 @@ int rect_testFRectEqualsParam(void *arg)
1698
1730
return TEST_COMPLETED ;
1699
1731
}
1700
1732
1733
+ /* !
1734
+ * \brief Test SDL_HasIntersectionF
1735
+ *
1736
+ * \sa
1737
+ * http://wiki.libsdl.org/SDL2/SDL_HasIntersectionF
1738
+ */
1739
+ int rect_testHasIntersectionF (void * arg )
1740
+ {
1741
+ const struct {
1742
+ SDL_FRect r1 ;
1743
+ SDL_FRect r2 ;
1744
+ SDL_bool expected ;
1745
+ } cases [] = {
1746
+ { { 0 , 0 , 0 , 0 }, {0 , 0 , 0 , 0 }, SDL_FALSE },
1747
+ { { 0 , 0 , -200 , 200 }, {0 , 0 , -200 , 200 }, SDL_FALSE },
1748
+ { { 0 , 0 , 10 , 10 }, {-5 , 5 , 10 , 2 }, SDL_TRUE },
1749
+ { { 0 , 0 , 10 , 10 }, {-5 , -5 , 10 , 2 }, SDL_FALSE },
1750
+ { { 0 , 0 , 10 , 10 }, {-5 , -5 , 2 , 10 }, SDL_FALSE },
1751
+ { { 0 , 0 , 10 , 10 }, {-5 , -5 , 5 , 5 }, SDL_FALSE },
1752
+ { { 0 , 0 , 10 , 10 }, {-5 , -5 , 5.1f , 5.1f }, SDL_TRUE },
1753
+ { { 0 , 0 , 10 , 10 }, {-4.99f , -4.99f , 5 , 5 }, SDL_TRUE },
1754
+ };
1755
+ size_t i ;
1756
+
1757
+ for (i = 0 ; i < SDL_arraysize (cases ); i ++ ) {
1758
+ SDL_bool result ;
1759
+ SDLTest_AssertPass ("About to call SDL_HasIntersectionF(&{ %g, %g, %g, %g }, &{ %g, %g, %g, %g })" ,
1760
+ cases [i ].r1 .x , cases [i ].r1 .y , cases [i ].r1 .w , cases [i ].r1 .h ,
1761
+ cases [i ].r2 .x , cases [i ].r2 .y , cases [i ].r2 .w , cases [i ].r2 .h
1762
+ );
1763
+ result = SDL_HasIntersectionF (& cases [i ].r1 , & cases [i ].r2 );
1764
+ SDLTest_AssertCheck (result == cases [i ].expected , "Got %d, expected %d" , result , cases [i ].expected );
1765
+ }
1766
+ return TEST_COMPLETED ;
1767
+ }
1768
+
1769
+ /* !
1770
+ * \brief Test SDL_IntersectFRect
1771
+ *
1772
+ * \sa
1773
+ * http://wiki.libsdl.org/SDL2/SDL_IntersectFRect
1774
+ */
1775
+ int rect_testIntersectFRect (void * arg )
1776
+ {
1777
+ const struct {
1778
+ SDL_FRect r1 ;
1779
+ SDL_FRect r2 ;
1780
+ SDL_bool result ;
1781
+ SDL_FRect intersect ;
1782
+ } cases [] = {
1783
+ { { 0 , 0 , 0 , 0 }, { 0 , 0 , 0 , 0 }, SDL_FALSE },
1784
+ { { 0 , 0 , -200 , 200 }, { 0 , 0 , -200 , 200 }, SDL_FALSE },
1785
+ { { 0 , 0 , 10 , 10 }, { -5 , 5 , 9.9f , 2 }, SDL_TRUE , { 0 , 5 , 4.9f , 2 } },
1786
+ { { 0 , 0 , 10 , 10 }, { -5 , -5 , 10 , 2 }, SDL_FALSE },
1787
+ { { 0 , 0 , 10 , 10 }, { -5 , -5 , 2 , 10 }, SDL_FALSE },
1788
+ { { 0 , 0 , 10 , 10 }, { -5 , -5 , 5 , 5 }, SDL_FALSE },
1789
+ { { 0 , 0 , 10 , 10 }, { -5 , -5 , 5.5f , 6 }, SDL_TRUE , { 0 , 0 , 0.5f , 1 } }
1790
+ };
1791
+ size_t i ;
1792
+
1793
+ for (i = 0 ; i < SDL_arraysize (cases ); i ++ ) {
1794
+ SDL_bool result ;
1795
+ SDL_FRect intersect ;
1796
+ SDLTest_AssertPass ("About to call SDL_IntersectFRect(&{ %g, %g, %g, %g }, &{ %g, %g, %g, %g })" ,
1797
+ cases [i ].r1 .x , cases [i ].r1 .y , cases [i ].r1 .w , cases [i ].r1 .h ,
1798
+ cases [i ].r2 .x , cases [i ].r2 .y , cases [i ].r2 .w , cases [i ].r2 .h
1799
+ );
1800
+ result = SDL_IntersectFRect (& cases [i ].r1 , & cases [i ].r2 , & intersect );
1801
+ SDLTest_AssertCheck (result == cases [i ].result , "Got %d, expected %d" , result , cases [i ].result );
1802
+ if (cases [i ].result ) {
1803
+ SDLTest_AssertCheck (IsFRectEqual (& intersect , & cases [i ].intersect ),
1804
+ "Got { %g, %g, %g, %g }, expected { %g, %g, %g, %g }" ,
1805
+ intersect .x , intersect .y , intersect .w , intersect .h ,
1806
+ cases [i ].intersect .x , cases [i ].intersect .y , cases [i ].intersect .w , cases [i ].intersect .h );
1807
+ }
1808
+ }
1809
+ return TEST_COMPLETED ;
1810
+ }
1811
+
1812
+ /* !
1813
+ * \brief Test SDL_UnionFRect
1814
+ *
1815
+ * \sa
1816
+ * http://wiki.libsdl.org/SDL2/SDL_UnionFRect
1817
+ */
1818
+ int rect_testUnionFRect (void * arg )
1819
+ {
1820
+ const struct {
1821
+ SDL_FRect r1 ;
1822
+ SDL_FRect r2 ;
1823
+ SDL_FRect expected ;
1824
+ } cases [] = {
1825
+ { { 0 , 0 , 10 , 10 }, { 19.9f , 20 , 10 , 10 }, { 0 , 0 , 29.9f , 30 } },
1826
+ { { 0 , 0 , 0 , 0 }, { 20 , 20.1f , 10.1f , 10 }, { 20 , 20.1f , 10.1f , 10 } },
1827
+ { { -200 , -4.5f , 450 , 33 }, { 20 , 20 , 10 , 10 }, { -200 , -4.5f , 450 , 34.5f } },
1828
+ { { 0 , 0 , 15 , 16.5f }, { 20 , 20 , 0 , 0 }, { 0 , 0 , 15 , 16.5f } }
1829
+ };
1830
+ size_t i ;
1831
+
1832
+ for (i = 0 ; i < SDL_arraysize (cases ); i ++ ) {
1833
+ SDL_FRect result ;
1834
+ SDLTest_AssertPass ("About to call SDL_UnionFRect(&{ %g, %g, %g, %g }, &{ %g, %g, %g, %g })" ,
1835
+ cases [i ].r1 .x , cases [i ].r1 .y , cases [i ].r1 .w , cases [i ].r1 .h ,
1836
+ cases [i ].r2 .x , cases [i ].r2 .y , cases [i ].r2 .w , cases [i ].r2 .h
1837
+ );
1838
+ SDL_UnionFRect (& cases [i ].r1 , & cases [i ].r2 , & result );
1839
+ SDLTest_AssertCheck (IsFRectEqual (& result , & cases [i ].expected ),
1840
+ "Got { %g, %g, %g, %g }, expected { %g, %g, %g, %g }" ,
1841
+ result .x , result .y , result .w , result .h ,
1842
+ cases [i ].expected .x , cases [i ].expected .y , cases [i ].expected .w , cases [i ].expected .h );
1843
+ }
1844
+ return TEST_COMPLETED ;
1845
+ }
1846
+
1847
+ /* !
1848
+ * \brief Test SDL_EncloseFPointsUnionFRect
1849
+ *
1850
+ * \sa
1851
+ * http://wiki.libsdl.org/SDL2/SDL_EncloseFPoints
1852
+ */
1853
+ int rect_testEncloseFPointsUnionFRect (void * arg )
1854
+ {
1855
+ const struct {
1856
+ SDL_bool with_clip ;
1857
+ SDL_FRect clip ;
1858
+ SDL_bool result ;
1859
+ SDL_FRect enclosing ;
1860
+ } cases [] = {
1861
+ { SDL_TRUE , { 0 , 0 , 10 , 10 }, SDL_TRUE , { 0.5f , 0.1f , 6 , 8 }},
1862
+ { SDL_TRUE , { 1.2f , 1 , 10 , 10 }, SDL_TRUE , { 1.5f , 1.1f , 5 , 7 }},
1863
+ { SDL_TRUE , { -10 , -10 , 3 , 3 }, SDL_FALSE },
1864
+ { SDL_FALSE , { 0 }, SDL_TRUE , { 0.5 , 0.1f , 6 , 8 }}
1865
+ };
1866
+ const SDL_FPoint points [] = {
1867
+ { 0.5f , 0.1f },
1868
+ { 5.5f , 7.1f },
1869
+ { 1.5f , 1.1f }
1870
+ };
1871
+ char points_str [256 ];
1872
+ size_t i ;
1873
+
1874
+ SDL_strlcpy (points_str , "{" , sizeof (points_str ));
1875
+ for (i = 0 ; i < SDL_arraysize (points ); i ++ ) {
1876
+ char point_str [32 ];
1877
+ SDL_snprintf (point_str , sizeof (point_str ), "{ %g, %g }, " , points [i ].x , points [i ].y );
1878
+ SDL_strlcat (points_str , point_str , sizeof (points_str ));
1879
+ }
1880
+ SDL_strlcat (points_str , "}" , sizeof (points_str ));
1881
+ for (i = 0 ; i < SDL_arraysize (cases ); i ++ ) {
1882
+ char clip_str [64 ];
1883
+ SDL_bool result ;
1884
+ SDL_FRect enclosing ;
1885
+ const SDL_FRect * clip_ptr = NULL ;
1886
+ if (cases [i ].with_clip ) {
1887
+ SDL_snprintf (clip_str , sizeof (clip_str ), "&{ %g, %g, %g, %g }" ,
1888
+ cases [i ].clip .x , cases [i ].clip .y , cases [i ].clip .w , cases [i ].clip .h );
1889
+ clip_ptr = & cases [i ].clip ;
1890
+ } else {
1891
+ SDL_strlcpy (clip_str , "NULL" , sizeof (clip_str ));
1892
+ }
1893
+ SDLTest_AssertPass ("About to call SDL_EncloseFPoints(&%s, %d, %s)" , points_str , (int )SDL_arraysize (points ), clip_str );
1894
+ result = SDL_EncloseFPoints (points , SDL_arraysize (points ), clip_ptr , & enclosing );
1895
+ SDLTest_AssertCheck (result == cases [i ].result , "Got %d, expected %d" , result , cases [i ].result );
1896
+ if (cases [i ].result ) {
1897
+ SDLTest_AssertCheck (IsFRectEqual (& enclosing , & cases [i ].enclosing ),
1898
+ "Got { %g, %g, %g, %g }, expected { %g, %g, %g, %g }" ,
1899
+ enclosing .x , enclosing .y , enclosing .w , enclosing .h ,
1900
+ cases [i ].enclosing .x , cases [i ].enclosing .y , cases [i ].enclosing .w , cases [i ].enclosing .h );
1901
+ }
1902
+ }
1903
+ return TEST_COMPLETED ;
1904
+ }
1905
+
1906
+ /* !
1907
+ * \brief Test SDL_IntersectFRectAndLine
1908
+ *
1909
+ * \sa
1910
+ * http://wiki.libsdl.org/SDL2/SDL_IntersectFRectAndLine
1911
+ */
1912
+ int rect_testIntersectFRectAndLine (void * arg )
1913
+ {
1914
+ const struct {
1915
+ SDL_FRect rect ;
1916
+ SDL_FPoint p1 ;
1917
+ SDL_FPoint p2 ;
1918
+ SDL_bool result ;
1919
+ SDL_FPoint expected1 ;
1920
+ SDL_FPoint expected2 ;
1921
+ } cases [] = {
1922
+ { { 0 , 0 , 0 , 0 }, { -4.8f , -4.8f }, { 5.2f , 5.2f }, SDL_FALSE },
1923
+ { { 0 , 0 , 2 , 2 }, { -1 , -1 }, { 3.5f , 3.5f }, SDL_TRUE , { 0 , 0 }, { 1 , 1 } },
1924
+ { { -4 , -4 , 14 , 14 }, { 8 , 22 }, { 8 , 33 }, SDL_FALSE }
1925
+
1926
+ };
1927
+ size_t i ;
1928
+
1929
+ for (i = 0 ; i < SDL_arraysize (cases ); i ++ ) {
1930
+ SDL_bool result ;
1931
+ SDL_FPoint p1 = cases [i ].p1 ;
1932
+ SDL_FPoint p2 = cases [i ].p2 ;
1933
+
1934
+ SDLTest_AssertPass ("About to call SDL_IntersectFRectAndLine(&{%g, %g, %g, %g}, &%g, &%g, &%g, &%g)" ,
1935
+ cases [i ].rect .x , cases [i ].rect .y , cases [i ].rect .w , cases [i ].rect .h ,
1936
+ p1 .x , p1 .y , p2 .x , p2 .y );
1937
+ result = SDL_IntersectFRectAndLine (& cases [i ].rect , & p1 .x , & p1 .y , & p2 .x , & p2 .y );
1938
+ SDLTest_AssertCheck (result == cases [i ].result , "Got %d, expected %d" , result , cases [i ].result );
1939
+ if (cases [i ].result ) {
1940
+ SDLTest_AssertCheck (IsFPointEqual (& p1 , & cases [i ].p1 ) && IsFPointEqual (& p2 , & cases [i ].p2 ),
1941
+ "Got p1={ %g, %g }, expected p1={ %g, %g }" ,
1942
+ p1 .x , p1 .y ,
1943
+ cases [i ].expected1 .x , cases [i ].expected1 .y );
1944
+ SDLTest_AssertCheck (IsFPointEqual (& p1 , & cases [i ].p1 ),
1945
+ "Got p2={ %g, %g }, expected p2={ %g, %g }" ,
1946
+ p2 .x , p2 .y ,
1947
+ cases [i ].expected2 .x , cases [i ].expected2 .y );
1948
+ }
1949
+ }
1950
+ return TEST_COMPLETED ;
1951
+ }
1952
+
1701
1953
/* ================= Test References ================== */
1702
1954
1703
1955
/* Rect test cases */
@@ -1836,6 +2088,26 @@ static const SDLTest_TestCaseReference rectTest31 = {
1836
2088
(SDLTest_TestCaseFp )rect_testFRectEqualsParam , "rect_testFRectEqualsParam" , "Negative tests against SDL_FRectEquals with invalid parameters" , TEST_ENABLED
1837
2089
};
1838
2090
2091
+ static const SDLTest_TestCaseReference rectTest32 = {
2092
+ (SDLTest_TestCaseFp )rect_testHasIntersectionF , "rect_testHasIntersectionF" , "Tests SDL_HasIntersectionF" , TEST_ENABLED
2093
+ };
2094
+
2095
+ static const SDLTest_TestCaseReference rectTest33 = {
2096
+ (SDLTest_TestCaseFp )rect_testIntersectFRect , "rect_IntersectFRect" , "Tests SDL_IntersectFRect" , TEST_ENABLED
2097
+ };
2098
+
2099
+ static const SDLTest_TestCaseReference rectTest34 = {
2100
+ (SDLTest_TestCaseFp )rect_testUnionFRect , "rect_testUnionFRect" , "Tests SDL_UnionFRect" , TEST_ENABLED
2101
+ };
2102
+
2103
+ static const SDLTest_TestCaseReference rectTest35 = {
2104
+ (SDLTest_TestCaseFp )rect_testUnionFRect , "rect_testEncloseFPointsUnionFRect" , "Tests SDL_EncloseFPoints" , TEST_ENABLED
2105
+ };
2106
+
2107
+ static const SDLTest_TestCaseReference rectTest36 = {
2108
+ (SDLTest_TestCaseFp )rect_testUnionFRect , "rect_testIntersectFRectAndLine" , "Tests SDL_IntersectFRectAndLine" , TEST_ENABLED
2109
+ };
2110
+
1839
2111
/* !
1840
2112
* \brief Sequence of Rect test cases; functions that handle simple rectangles including overlaps and merges.
1841
2113
*
@@ -1845,7 +2117,7 @@ static const SDLTest_TestCaseReference rectTest31 = {
1845
2117
static const SDLTest_TestCaseReference * rectTests [] = {
1846
2118
& rectTest1 , & rectTest2 , & rectTest3 , & rectTest4 , & rectTest5 , & rectTest6 , & rectTest7 , & rectTest8 , & rectTest9 , & rectTest10 , & rectTest11 , & rectTest12 , & rectTest13 , & rectTest14 ,
1847
2119
& rectTest15 , & rectTest16 , & rectTest17 , & rectTest18 , & rectTest19 , & rectTest20 , & rectTest21 , & rectTest22 , & rectTest23 , & rectTest24 , & rectTest25 , & rectTest26 , & rectTest27 ,
1848
- & rectTest28 , & rectTest29 , & rectTest30 , & rectTest31 , NULL
2120
+ & rectTest28 , & rectTest29 , & rectTest30 , & rectTest31 , & rectTest32 , & rectTest33 , & rectTest34 , & rectTest35 , & rectTest36 , NULL
1849
2121
};
1850
2122
1851
2123
/* Rect test suite (global) */
0 commit comments