Skip to content

Commit 45924cf

Browse files
authored
Merge pull request #2313 from pygame-community/ankith26-rect-impl-fixes
Fix FRect slice subscripting
2 parents 1f48a95 + 6439bae commit 45924cf

File tree

2 files changed

+40
-15
lines changed

2 files changed

+40
-15
lines changed

src_c/rect_impl.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1977,7 +1977,7 @@ RectExport_subscript(RectObject *self, PyObject *op)
19771977
return NULL;
19781978
}
19791979
for (i = 0; i < slicelen; ++i) {
1980-
n = PyLong_FromSsize_t((Py_ssize_t)data[start + (step * i)]);
1980+
n = PythonNumberFromPrimitiveType(data[start + (step * i)]);
19811981
if (n == NULL) {
19821982
Py_DECREF(slice);
19831983
return NULL;

test/rect_test.py

Lines changed: 39 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2972,20 +2972,20 @@ def assertAlmostEqual5(self, first, second):
29722972
"""
29732973
self.assertAlmostEqual(first, second, places=5)
29742974

2975-
def assertAlmostEqual5C(self, first, second):
2975+
def assertSeqAlmostEqual5(self, first, second):
29762976
"""
2977-
This shouldn't be necessary but manylinux i686 python37
2978-
won't work with just assertAlmostEqual5-ing it.
2977+
Same as above but for sequences
29792978
"""
2980-
self.assertAlmostEqual(first[0], second[0], places=5)
2981-
self.assertAlmostEqual(first[1], second[1], places=5)
2979+
self.assertEqual(len(first), len(second))
2980+
for i, j in zip(first, second):
2981+
self.assertAlmostEqual5(i, j)
29822982

29832983
def test_scale_by__larger_single_argument(self):
29842984
"""The scale method scales around the center of the rectangle"""
29852985
r = FRect(2.1, 4, 6, 8.9)
29862986
r2 = r.scale_by(2.3)
29872987

2988-
self.assertAlmostEqual5C(r.center, r2.center)
2988+
self.assertSeqAlmostEqual5(r.center, r2.center)
29892989
# ((w * scaling) - w) / 2 -> 3.9
29902990
self.assertAlmostEqual5(r.left - 3.9, r2.left)
29912991
self.assertAlmostEqual5(r.top - 5.785, r2.top)
@@ -3000,7 +3000,7 @@ def test_scale_by__larger_single_argument_kwarg(self):
30003000
r = FRect(2.1, 4, 6, 8.9)
30013001
r2 = r.scale_by(x=2.3)
30023002

3003-
self.assertAlmostEqual5C(r.center, r2.center)
3003+
self.assertSeqAlmostEqual5(r.center, r2.center)
30043004
# ((w * scaling) - w) / 2 -> 3.9
30053005
self.assertAlmostEqual5(r.left - 3.9, r2.left)
30063006
self.assertAlmostEqual5(r.top - 5.785, r2.top)
@@ -3014,7 +3014,7 @@ def test_scale_by__smaller_single_argument(self):
30143014
r = FRect(2.1, 4, 6, 8.9)
30153015
r2 = r.scale_by(0.5)
30163016

3017-
self.assertAlmostEqual5C(r.center, r2.center)
3017+
self.assertSeqAlmostEqual5(r.center, r2.center)
30183018
self.assertAlmostEqual5(r.left + 1.5, r2.left)
30193019
self.assertAlmostEqual5(r.top + 2.225, r2.top)
30203020
self.assertAlmostEqual5(r.right - 1.5, r2.right)
@@ -3029,7 +3029,7 @@ def test_scale_by__larger(self):
30293029
# act
30303030
r2 = r.scale_by(2, 4)
30313031
# assert
3032-
self.assertAlmostEqual5C(r.center, r2.center)
3032+
self.assertSeqAlmostEqual5(r.center, r2.center)
30333033
self.assertAlmostEqual5(r.left - 3, r2.left)
30343034
self.assertAlmostEqual5(r.centery - r.h * 4 / 2, r2.top)
30353035
self.assertAlmostEqual5(r.right + 3, r2.right)
@@ -3047,7 +3047,7 @@ def test_scale_by__larger_kwargs_scale_by(self):
30473047
# act
30483048
r2 = r.scale_by(scale_by=(2, 4))
30493049
# assert
3050-
self.assertAlmostEqual5C(r.center, r2.center)
3050+
self.assertSeqAlmostEqual5(r.center, r2.center)
30513051
self.assertAlmostEqual5(r.left - 3, r2.left)
30523052
self.assertAlmostEqual5(r.centery - r.h * 4 / 2, r2.top)
30533053
self.assertAlmostEqual5(r.right + 3, r2.right)
@@ -3065,7 +3065,7 @@ def test_scale_by__larger_kwargs(self):
30653065
# act
30663066
r2 = r.scale_by(x=2, y=4)
30673067
# assert
3068-
self.assertAlmostEqual5C(r.center, r2.center)
3068+
self.assertSeqAlmostEqual5(r.center, r2.center)
30693069
self.assertAlmostEqual5(r.left - 3, r2.left)
30703070
self.assertAlmostEqual5(r.centery - r.h * 4 / 2, r2.top)
30713071
self.assertAlmostEqual5(r.right + 3, r2.right)
@@ -3080,7 +3080,7 @@ def test_scale_by__smaller(self):
30803080
# act
30813081
r2 = r.scale_by(0.5, 0.25)
30823082
# assert
3083-
self.assertAlmostEqual5C(r.center, r2.center)
3083+
self.assertSeqAlmostEqual5(r.center, r2.center)
30843084
self.assertAlmostEqual5(r.left + 1.5, r2.left)
30853085
self.assertAlmostEqual5(r.centery - r.h / 4 / 2, r2.top)
30863086
self.assertAlmostEqual5(r.right - 1.5, r2.right)
@@ -3178,7 +3178,7 @@ def test_scale_by_ip__larger(self):
31783178
r2 = FRect(r)
31793179
r2.scale_by_ip(2.3)
31803180

3181-
self.assertAlmostEqual5C(r.center, r2.center)
3181+
self.assertSeqAlmostEqual5(r.center, r2.center)
31823182
# ((w * scaling) - w) / 2 -> 3.9
31833183
self.assertAlmostEqual5(r.left - 3.9, r2.left)
31843184
self.assertAlmostEqual5(r.top - 5.785, r2.top)
@@ -3193,7 +3193,7 @@ def test_scale_by_ip__smaller(self):
31933193
r2 = FRect(r)
31943194
r2.scale_by_ip(0.5)
31953195

3196-
self.assertAlmostEqual5C(r.center, r2.center)
3196+
self.assertSeqAlmostEqual5(r.center, r2.center)
31973197
self.assertAlmostEqual5(r.left + 1.5, r2.left)
31983198
self.assertAlmostEqual5(r.top + 2.225, r2.top)
31993199
self.assertAlmostEqual5(r.right - 1.5, r2.right)
@@ -3235,6 +3235,31 @@ def test_scale_by_ip__kwarg_exceptions(self):
32353235
with self.assertRaises(TypeError):
32363236
r.scale_by_ip(scale_by=(1, 2), y=1)
32373237

3238+
def test_frect_subscript(self):
3239+
r = FRect(1.2, 2.4, 3.6, 4.8)
3240+
self.assertAlmostEqual5(r[0], 1.2)
3241+
self.assertAlmostEqual5(r[1], 2.4)
3242+
self.assertAlmostEqual5(r[2], 3.6)
3243+
self.assertAlmostEqual5(r[3], 4.8)
3244+
self.assertEqual(r[-1], r[3])
3245+
self.assertEqual(r[-2], r[2])
3246+
self.assertEqual(r[-3], r[1])
3247+
self.assertEqual(r[-4], r[0])
3248+
self.assertRaises(IndexError, r.__getitem__, 5)
3249+
self.assertRaises(IndexError, r.__getitem__, -5)
3250+
self.assertSeqAlmostEqual5(r[0:2], [1.2, 2.4])
3251+
self.assertSeqAlmostEqual5(r[0:4], [1.2, 2.4, 3.6, 4.8])
3252+
self.assertSeqAlmostEqual5(r[0:-1], [1.2, 2.4, 3.6])
3253+
self.assertSeqAlmostEqual5(r[:], [1.2, 2.4, 3.6, 4.8])
3254+
self.assertSeqAlmostEqual5(r[...], [1.2, 2.4, 3.6, 4.8])
3255+
self.assertEqual(r[0:4], r)
3256+
self.assertEqual(r[:], r)
3257+
self.assertEqual(r[...], r)
3258+
self.assertSeqAlmostEqual5(r[0:4:2], [1.2, 3.6])
3259+
self.assertSeqAlmostEqual5(r[0:4:3], [1.2, 4.8])
3260+
self.assertSeqAlmostEqual5(r[3::-1], [4.8, 3.6, 2.4, 1.2])
3261+
self.assertRaises(TypeError, r.__getitem__, None)
3262+
32383263

32393264
class SubclassTest(unittest.TestCase):
32403265
class MyRect(Rect):

0 commit comments

Comments
 (0)