summaryrefslogtreecommitdiff
path: root/testing
diff options
context:
space:
mode:
authorArmin Rigo <arigo@tunes.org>2013-11-06 15:18:01 +0100
committerArmin Rigo <arigo@tunes.org>2013-11-06 15:18:01 +0100
commit7cf75775cd84fc079a5adcb3899a72e4ce2b6c9c (patch)
tree2b0fd0ed5bdb0d1075208db5ae7af666917cc52d /testing
parenta3353114b67cc24a2139a6961d8b76bf66776d86 (diff)
downloadcffi-7cf75775cd84fc079a5adcb3899a72e4ce2b6c9c.tar.gz
Some target tests
Diffstat (limited to 'testing')
-rw-r--r--testing/test_verify.py61
1 files changed, 50 insertions, 11 deletions
diff --git a/testing/test_verify.py b/testing/test_verify.py
index c304f18..10afb47 100644
--- a/testing/test_verify.py
+++ b/testing/test_verify.py
@@ -479,32 +479,71 @@ def test_struct_array_field():
s = ffi.new("struct foo_s *")
assert ffi.sizeof(s.a) == 17 * ffi.sizeof('int')
-def test_struct_array_guess_length():
- ffi = FFI()
- ffi.cdef("struct foo_s { int a[]; ...; };") # <= no declared length
- ffi.verify("struct foo_s { int x; int a[17]; int y; };")
- assert ffi.sizeof('struct foo_s') == 19 * ffi.sizeof('int')
- s = ffi.new("struct foo_s *")
- assert ffi.sizeof(s.a) == 17 * ffi.sizeof('int')
-
-def test_struct_array_guess_length_2():
+def test_struct_array_no_length():
ffi = FFI()
- ffi.cdef("struct foo_s { int a[]; ...; };\n" # <= no declared length
+ ffi.cdef("struct foo_s { int a[]; int y; ...; };\n"
"int bar(struct foo_s *);\n")
lib = ffi.verify("struct foo_s { int x; int a[17]; int y; };\n"
"int bar(struct foo_s *f) { return f->a[14]; }\n")
assert ffi.sizeof('struct foo_s') == 19 * ffi.sizeof('int')
s = ffi.new("struct foo_s *")
+ assert ffi.typeof(s.a) is ffi.typeof('int *') # because no length
s.a[14] = 4242
assert lib.bar(s) == 4242
+ # with no declared length, out-of-bound accesses are not detected
+ s.a[17] = -521
+ assert s.y == s.a[17] == -521
+ #
+ s = ffi.new("struct foo_s *", {'a': list(range(17))})
+ assert s.a[16] == 16
+ # overflows at construction time not detected either
+ s = ffi.new("struct foo_s *", {'a': list(range(18))})
+ assert s.y == s.a[17] == 17
-def test_struct_array_guess_length_3():
+def test_struct_array_guess_length():
ffi = FFI()
ffi.cdef("struct foo_s { int a[...]; };")
ffi.verify("struct foo_s { int x; int a[17]; int y; };")
assert ffi.sizeof('struct foo_s') == 19 * ffi.sizeof('int')
s = ffi.new("struct foo_s *")
assert ffi.sizeof(s.a) == 17 * ffi.sizeof('int')
+ py.test.raises(IndexError, 's.a[17]')
+
+def test_struct_array_c99_1():
+ if sys.platform == 'win32':
+ py.test.skip("requires C99")
+ ffi = FFI()
+ ffi.cdef("struct foo_s { int x; int a[]; };")
+ ffi.verify("struct foo_s { int x; int a[]; };")
+ assert ffi.sizeof('struct foo_s') == 1 * ffi.sizeof('int')
+ s = ffi.new("struct foo_s *", [424242, 4])
+ assert ffi.sizeof(s) == 5 * ffi.sizeof('int')
+ assert s.a[3] == 0
+ s = ffi.new("struct foo_s *", [424242, [-40, -30, -20, -10]])
+ assert ffi.sizeof(s) == 5 * ffi.sizeof('int')
+ assert s.a[3] == -10
+ s = ffi.new("struct foo_s *")
+ assert ffi.sizeof(s) == 1 * ffi.sizeof('int')
+ s = ffi.new("struct foo_s *", [424242])
+ assert ffi.sizeof(s) == 1 * ffi.sizeof('int')
+
+def test_struct_array_c99_2():
+ if sys.platform == 'win32':
+ py.test.skip("requires C99")
+ ffi = FFI()
+ ffi.cdef("struct foo_s { int x; int a[]; ...; };")
+ ffi.verify("struct foo_s { int x, y; int a[]; };")
+ assert ffi.sizeof('struct foo_s') == 2 * ffi.sizeof('int')
+ s = ffi.new("struct foo_s *", [424242, 4])
+ assert ffi.sizeof(s) == 6 * ffi.sizeof('int')
+ assert s.a[3] == 0
+ s = ffi.new("struct foo_s *", [424242, [-40, -30, -20, -10]])
+ assert ffi.sizeof(s) == 6 * ffi.sizeof('int')
+ assert s.a[3] == -10
+ s = ffi.new("struct foo_s *")
+ assert ffi.sizeof(s) == 2 * ffi.sizeof('int')
+ s = ffi.new("struct foo_s *", [424242])
+ assert ffi.sizeof(s) == 2 * ffi.sizeof('int')
def test_struct_ptr_to_array_field():
ffi = FFI()