FFI: FFI-Tests-mt.18.mcz

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

FFI: FFI-Tests-mt.18.mcz

commits-2
Marcel Taeumel uploaded a new version of FFI-Tests to project FFI:
http://source.squeak.org/FFI/FFI-Tests-mt.18.mcz

==================== Summary ====================

Name: FFI-Tests-mt.18
Author: mt
Time: 11 June 2020, 11:23:10.390059 am
UUID: 468e6185-2cb9-c248-9288-e67137e7b144
Ancestors: FFI-Tests-mt.17

- Adds tests for type-name lookup, which is used during struct-field and FFI-call compilation. Organize fixtures in "FFI-Tests-Fixtures".
- Explicates #ffiLongVsInt issue.
- Fixes one test that actually called to a 'long' in C to use 'c_long' instead of 'long'.
- Adds tests for 'bool' support, which maps to 'unsigned int' in the FFI plugin, which you can see in ByteArray>>#booleanAt:(put:).
- Exposes new functions, which are already exported in the current FFI plugin: ffiTest4IntSum, ffiTest8IntSum.

=============== Diff against FFI-Tests-mt.17 ===============

Item was changed:
  SystemOrganization addCategory: #'FFI-Tests'!
+ SystemOrganization addCategory: #'FFI-Tests-Fixtures'!

Item was added:
+ ----- Method: FFIPluginTests>>testGenericBoolCall (in category 'simple tests') -----
+ testGenericBoolCall
+ "Test using generic FFI spec"
+ | result |
+ result := FFITestLibrary ffiTestBool: true with: false with: true with: false.
+ self assert: result.!

Item was added:
+ ----- Method: FFIPluginTests>>testGenericBoolCall2 (in category 'simple tests') -----
+ testGenericBoolCall2
+ "Test using generic FFI spec"
+ | result |
+ result := FFITestLibrary ffiTestBool: false with: false with: true with: true.
+ self deny: result.!

Item was added:
+ ----- Method: FFIPluginTests>>testGenericBoolCall3 (in category 'simple tests') -----
+ testGenericBoolCall3
+ "Test using generic FFI spec"
+ | result |
+ result := FFITestLibrary ffiTestBool: -1 with: 1 with: 0 with: 0.
+ self deny: result.!

Item was changed:
  ----- Method: FFIPluginTests>>testGenericIntCall (in category 'simple tests') -----
  testGenericIntCall
  "Test using generic FFI spec"
  | result |
+ self flag: #ffiLongVsInt.
  result := FFITestLibrary ffiTestInt: $A with: 65 with: 65.0 with: true.
  self assert: result = 130.!

Item was added:
+ ----- Method: FFIPluginTests>>testGenericLongCall (in category 'simple tests') -----
+ testGenericLongCall
+ "Test using generic FFI spec"
+ | result |
+ self flag: #ffiLongVsInt.
+ result := FFITestLibrary ffiTestLong: $A with: 65 with: 65.0 with: true.
+ self assert: result = 130.!

Item was changed:
  ----- Method: FFIPluginTests>>testMixedDoublesAndLongsSum (in category 'simple tests') -----
  testMixedDoublesAndLongsSum
  "Test using generic FFI spec"
  | result meth n args |
  meth := ExternalLibraryFunction
  name:'ffiTestMixedDoublesAndLongs' module: FFITestLibrary moduleName
  callType: 0 returnType: ExternalType double
+ argumentTypes: ((1 to: (n := 20)) collect:[:i| i odd ifTrue: [ExternalType double] ifFalse: [ExternalType c_long]]).
- argumentTypes: ((1 to: (n := 20)) collect:[:i| i odd ifTrue: [ExternalType double] ifFalse: [ExternalType long]]).
  args := (1 to: n) collect: [:i| i odd ifTrue: [(i // 2) odd ifTrue: [123.456 * (10 raisedTo: i)] ifFalse: [-654.321 * (10 raisedTo: i)]] ifFalse: [(i // 2) odd ifTrue: [54321 * i] ifFalse: [-54321 * i]]].
  result := meth invokeWithArguments: args asArray.
  self assert: args sum equals: result!

Item was added:
+ ----- Method: FFIPluginTests>>testUintRange (in category 'simple tests') -----
+ testUintRange
+ "Simple test for making sure the FFI can call certain numbers in the uint range."
+ | result |
+ self flag: #ffiLongVsInt.
+ self shouldnt:[result := FFITestLibrary ffiTestUint:  3894967296 "1<<32-4e8 " with: 3894967296 with: 3103854339 with: 3103854339] raise: Error.
+ self should: result =  -8e8.!

Item was changed:
  ----- Method: FFIPluginTests>>testUlongRange (in category 'simple tests') -----
  testUlongRange
  "Simple test for making sure the FFI can call certain numbers in the ulong range.
+ Note: since primitive is using unsigned int under the hood, avoid an integer overflow by choosing appropriate unsigned values.
- Note: since primitive is using signed int under the hood, avoid an integer overflow by choosing appropriate unsigned values.
  Note: only first two parameters are added"
  | result |
+ self flag: #ffiLongVsInt.
  self shouldnt:[result := FFITestLibrary ffiTestUlong:  3894967296 "1<<32-4e8 " with: 3894967296 with: 3103854339 with: 3103854339] raise: Error.
  self should: result =  -8e8.!

Item was changed:
  ExternalStructure subclass: #FFISmallStruct1
  instanceVariableNames: ''
  classVariableNames: ''
  poolDictionaries: ''
+ category: 'FFI-Tests-Fixtures'!
- category: 'FFI-Tests'!

Item was changed:
  ExternalStructure subclass: #FFITestBiggerStruct
  instanceVariableNames: ''
  classVariableNames: ''
  poolDictionaries: ''
+ category: 'FFI-Tests-Fixtures'!
- category: 'FFI-Tests'!

Item was changed:
  ExternalStructure subclass: #FFITestCompoundStruct
  instanceVariableNames: ''
  classVariableNames: ''
  poolDictionaries: ''
+ category: 'FFI-Tests-Fixtures'!
- category: 'FFI-Tests'!

Item was changed:
  ExternalLibrary subclass: #FFITestLibrary
  instanceVariableNames: ''
  classVariableNames: ''
  poolDictionaries: ''
+ category: 'FFI-Tests-Fixtures'!
- category: 'FFI-Tests'!
 
  !FFITestLibrary commentStamp: 'ar 8/14/2006 23:06' prior: 0!
  ExternalLibrarty used in FFI tests!

Item was added:
+ ----- Method: FFITestLibrary class>>ffiTest4IntSum:with:with:with: (in category 'primitives - long vs. int') -----
+ ffiTest4IntSum: c1 with: c2 with: c3 with: c4
+ "FFITestLibrary ffiTest4IntSum: 1 with: 2 with: 3 with: 4"
+ <cdecl: int 'ffiTest4IntSum' (int int int int) module:'SqueakFFIPrims'>
+ self flag: #ffiLongVsInt.
+ ^self externalCallFailed!

Item was added:
+ ----- Method: FFITestLibrary class>>ffiTest4LongSum:with:with:with: (in category 'primitives - long vs. int') -----
+ ffiTest4LongSum: c1 with: c2 with: c3 with: c4
+ "FFITestLibrary ffiTest4LongSum: 1 with: 2 with: 3 with: 4"
+ <cdecl: long 'ffiTest4IntSum' (long long long long) module:'SqueakFFIPrims'>
+ self flag: #ffiLongVsInt.
+ ^self externalCallFailed!

Item was added:
+ ----- Method: FFITestLibrary class>>ffiTest8IntSum:with:with:with:with:with:with:with: (in category 'primitives - long vs. int') -----
+ ffiTest8IntSum: c1 with: c2 with: c3 with: c4 with: c5 with: c6 with: c7 with: c8
+ "FFITestLibrary ffiTest8IntSum: 1 with: 2 with: 3 with: 4 with: 5 with: 6 with: 7 with: 8"
+ <cdecl: int 'ffiTest8IntSum' (int int int int int int int int) module:'SqueakFFIPrims'>
+ self flag: #ffiLongVsInt.
+ ^self externalCallFailed!

Item was added:
+ ----- Method: FFITestLibrary class>>ffiTest8LongSum:with:with:with:with:with:with:with: (in category 'primitives - long vs. int') -----
+ ffiTest8LongSum: c1 with: c2 with: c3 with: c4 with: c5 with: c6 with: c7 with: c8
+ "FFITestLibrary ffiTest8LongSum: 1 with: 2 with: 3 with: 4 with: 5 with: 6 with: 7 with: 8"
+ <cdecl: long 'ffiTest8IntSum' (long long long long long long long long) module:'SqueakFFIPrims'>
+ self flag: #ffiLongVsInt.
+ ^self externalCallFailed!

Item was added:
+ ----- Method: FFITestLibrary class>>ffiTestBool:with:with:with: (in category 'primitives') -----
+ ffiTestBool: b1 with: b2 with: b3 with: b4
+ "FFITestLibrary ffiTestBool: true with: false with: true with: false"
+ <cdecl: bool 'ffiTestInts' (bool bool bool bool) module:'SqueakFFIPrims'>
+ ^self externalCallFailed!

Item was changed:
+ ----- Method: FFITestLibrary class>>ffiTestInt:with:with:with: (in category 'primitives - long vs. int') -----
- ----- Method: FFITestLibrary class>>ffiTestInt:with:with:with: (in category 'primitives') -----
  ffiTestInt: c1 with: c2 with: c3 with: c4
  "FFITestLibrary ffiTestInt: $A with: 65 with: 65.0 with: true"
+ <cdecl: int 'ffiTestInts' (int int int int) module:'SqueakFFIPrims'>
+ self flag: #ffiLongVsInt.
- <cdecl: long 'ffiTestInts' (long long long long) module:'SqueakFFIPrims'>
  ^self externalCallFailed!

Item was added:
+ ----- Method: FFITestLibrary class>>ffiTestLong:with:with:with: (in category 'primitives - long vs. int') -----
+ ffiTestLong: c1 with: c2 with: c3 with: c4
+ "FFITestLibrary ffiTestLong: $A with: 65 with: 65.0 with: true"
+ <cdecl: long 'ffiTestInts' (long long long long) module:'SqueakFFIPrims'>
+ self flag: #ffiLongVsInt.
+ ^self externalCallFailed!

Item was added:
+ ----- Method: FFITestLibrary class>>ffiTestUint:with:with:with: (in category 'primitives - long vs. int') -----
+ ffiTestUint: c1 with: c2 with: c3 with: c4
+ "FFITestLibrary ffiTestUint: 3103854339 with: 3103854339 with: 3103854339 with: 3103854339"
+ <cdecl: int 'ffiTestInts' (uint uint uint uint) module:'SqueakFFIPrims'>
+ self flag: #ffiLongVsInt.
+ ^self externalCallFailed!

Item was changed:
+ ----- Method: FFITestLibrary class>>ffiTestUlong:with:with:with: (in category 'primitives - long vs. int') -----
- ----- Method: FFITestLibrary class>>ffiTestUlong:with:with:with: (in category 'primitives') -----
  ffiTestUlong: c1 with: c2 with: c3 with: c4
  "FFITestLibrary ffiTestUlong: 3103854339 with: 3103854339 with: 3103854339 with: 3103854339"
  <cdecl: long 'ffiTestInts' (ulong ulong ulong ulong) module:'SqueakFFIPrims'>
+ self flag: #ffiLongVsInt.
  ^self externalCallFailed!

Item was added:
+ ----- Method: FFITestLibrary class>>ffiTestVoid (in category 'mocks') -----
+ ffiTestVoid
+ "Note that ffiTestVoid does exist in the module."
+ <cdecl: void 'ffiTestVoid' (void) module:'SqueakFFIPrims'>
+ ^self externalCallFailed!

Item was added:
+ ----- Method: FFITestLibrary class>>ffiTestVoidPointer (in category 'mocks') -----
+ ffiTestVoidPointer
+ "Note that ffiTestVoidPointer does exist in the module."
+ <cdecl: void* 'ffiTestVoidPointer' (void*) module:'SqueakFFIPrims'>
+ ^self externalCallFailed!

Item was changed:
  ExternalStructure subclass: #FFITestMisalignedCompoundStruct
  instanceVariableNames: ''
  classVariableNames: ''
  poolDictionaries: ''
+ category: 'FFI-Tests-Fixtures'!
- category: 'FFI-Tests'!

Item was changed:
  ExternalStructure subclass: #FFITestMisalignedStruct
  instanceVariableNames: ''
  classVariableNames: ''
  poolDictionaries: ''
+ category: 'FFI-Tests-Fixtures'!
- category: 'FFI-Tests'!

Item was changed:
  ExternalStructure subclass: #FFITestPoint2
  instanceVariableNames: ''
  classVariableNames: ''
  poolDictionaries: ''
+ category: 'FFI-Tests-Fixtures'!
- category: 'FFI-Tests'!
 
  !FFITestPoint2 commentStamp: 'ar 8/14/2006 23:06' prior: 0!
  A class used for testing structures as arguments for the FFI.!

Item was changed:
  ExternalStructure subclass: #FFITestPoint4
  instanceVariableNames: ''
  classVariableNames: ''
  poolDictionaries: ''
+ category: 'FFI-Tests-Fixtures'!
- category: 'FFI-Tests'!
 
  !FFITestPoint4 commentStamp: 'ar 8/14/2006 23:06' prior: 0!
  A class used for testing structures as arguments for the FFI.!

Item was changed:
  ExternalStructure subclass: #FFITestSSdi5
  instanceVariableNames: ''
  classVariableNames: ''
  poolDictionaries: ''
+ category: 'FFI-Tests-Fixtures'!
- category: 'FFI-Tests'!

Item was changed:
  ExternalStructure subclass: #FFITestSUfdUdSi2
  instanceVariableNames: ''
  classVariableNames: ''
  poolDictionaries: ''
+ category: 'FFI-Tests-Fixtures'!
- category: 'FFI-Tests'!

Item was changed:
  ExternalStructure subclass: #FFITestSUfdUfi
  instanceVariableNames: ''
  classVariableNames: ''
  poolDictionaries: ''
+ category: 'FFI-Tests-Fixtures'!
- category: 'FFI-Tests'!

Item was changed:
  ExternalStructure subclass: #FFITestSd2
  instanceVariableNames: ''
  classVariableNames: ''
  poolDictionaries: ''
+ category: 'FFI-Tests-Fixtures'!
- category: 'FFI-Tests'!

Item was changed:
  ExternalStructure subclass: #FFITestSdi
  instanceVariableNames: ''
  classVariableNames: ''
  poolDictionaries: ''
+ category: 'FFI-Tests-Fixtures'!
- category: 'FFI-Tests'!

Item was changed:
  ExternalStructure subclass: #FFITestSf2
  instanceVariableNames: ''
  classVariableNames: ''
  poolDictionaries: ''
+ category: 'FFI-Tests-Fixtures'!
- category: 'FFI-Tests'!

Item was changed:
  ExternalStructure subclass: #FFITestSf2d
  instanceVariableNames: ''
  classVariableNames: ''
  poolDictionaries: ''
+ category: 'FFI-Tests-Fixtures'!
- category: 'FFI-Tests'!

Item was changed:
  ExternalStructure subclass: #FFITestSf4
  instanceVariableNames: ''
  classVariableNames: ''
  poolDictionaries: ''
+ category: 'FFI-Tests-Fixtures'!
- category: 'FFI-Tests'!

Item was changed:
  ExternalStructure subclass: #FFITestSfd
  instanceVariableNames: ''
  classVariableNames: ''
  poolDictionaries: ''
+ category: 'FFI-Tests-Fixtures'!
- category: 'FFI-Tests'!

Item was changed:
  ExternalStructure subclass: #FFITestSfdf
  instanceVariableNames: ''
  classVariableNames: ''
  poolDictionaries: ''
+ category: 'FFI-Tests-Fixtures'!
- category: 'FFI-Tests'!

Item was changed:
  ExternalStructure subclass: #FFITestSfi
  instanceVariableNames: ''
  classVariableNames: ''
  poolDictionaries: ''
+ category: 'FFI-Tests-Fixtures'!
- category: 'FFI-Tests'!

Item was changed:
  ExternalStructure subclass: #FFITestSi2
  instanceVariableNames: ''
  classVariableNames: ''
  poolDictionaries: ''
+ category: 'FFI-Tests-Fixtures'!
- category: 'FFI-Tests'!

Item was changed:
  ExternalStructure subclass: #FFITestSl2
  instanceVariableNames: ''
  classVariableNames: ''
  poolDictionaries: ''
+ category: 'FFI-Tests-Fixtures'!
- category: 'FFI-Tests'!

Item was changed:
  ExternalStructure subclass: #FFITestSs2
  instanceVariableNames: ''
  classVariableNames: ''
  poolDictionaries: ''
+ category: 'FFI-Tests-Fixtures'!
- category: 'FFI-Tests'!

Item was changed:
  ExternalStructure subclass: #FFITestSs2i
  instanceVariableNames: ''
  classVariableNames: ''
  poolDictionaries: ''
+ category: 'FFI-Tests-Fixtures'!
- category: 'FFI-Tests'!

Item was changed:
  ExternalStructure subclass: #FFITestSs4
  instanceVariableNames: ''
  classVariableNames: ''
  poolDictionaries: ''
+ category: 'FFI-Tests-Fixtures'!
- category: 'FFI-Tests'!

Item was changed:
  ExternalStructure subclass: #FFITestSsSsf
  instanceVariableNames: ''
  classVariableNames: ''
  poolDictionaries: ''
+ category: 'FFI-Tests-Fixtures'!
- category: 'FFI-Tests'!

Item was changed:
  ExternalStructure subclass: #FFITestSsSsi
  instanceVariableNames: ''
  classVariableNames: ''
  poolDictionaries: ''
+ category: 'FFI-Tests-Fixtures'!
- category: 'FFI-Tests'!

Item was changed:
  ExternalStructure subclass: #FFITestSsf
  instanceVariableNames: ''
  classVariableNames: ''
  poolDictionaries: ''
+ category: 'FFI-Tests-Fixtures'!
- category: 'FFI-Tests'!

Item was changed:
  ExternalStructure subclass: #FFITestSsi
  instanceVariableNames: ''
  classVariableNames: ''
  poolDictionaries: ''
+ category: 'FFI-Tests-Fixtures'!
- category: 'FFI-Tests'!

Item was changed:
  ExternalStructure subclass: #FFITestSsis
  instanceVariableNames: ''
  classVariableNames: ''
  poolDictionaries: ''
+ category: 'FFI-Tests-Fixtures'!
- category: 'FFI-Tests'!

Item was changed:
  ExternalStructure subclass: #FFITestSslf
  instanceVariableNames: ''
  classVariableNames: ''
  poolDictionaries: ''
+ category: 'FFI-Tests-Fixtures'!
- category: 'FFI-Tests'!

Item was changed:
  ExternalStructure subclass: #FFITestSsls
  instanceVariableNames: ''
  classVariableNames: ''
  poolDictionaries: ''
+ category: 'FFI-Tests-Fixtures'!
- category: 'FFI-Tests'!

Item was changed:
  ExternalUnion subclass: #FFITestUdSi2
  instanceVariableNames: ''
  classVariableNames: ''
  poolDictionaries: ''
+ category: 'FFI-Tests-Fixtures'!
- category: 'FFI-Tests'!

Item was changed:
  ExternalUnion subclass: #FFITestUfd
  instanceVariableNames: ''
  classVariableNames: ''
  poolDictionaries: ''
+ category: 'FFI-Tests-Fixtures'!
- category: 'FFI-Tests'!

Item was changed:
  ExternalUnion subclass: #FFITestUfi
  instanceVariableNames: ''
  classVariableNames: ''
  poolDictionaries: ''
+ category: 'FFI-Tests-Fixtures'!
- category: 'FFI-Tests'!

Item was added:
+ TestCase subclass: #FFITypeNameTests
+ instanceVariableNames: ''
+ classVariableNames: ''
+ poolDictionaries: ''
+ category: 'FFI-Tests'!

Item was added:
+ ----- Method: FFITypeNameTests>>argTypesAt: (in category 'support') -----
+ argTypesAt: selector
+
+ ^ (FFITestLibrary class >> selector) externalLibraryFunction argTypes!

Item was added:
+ ----- Method: FFITypeNameTests>>testAtomicBool (in category 'tests') -----
+ testAtomicBool
+
+ self
+ flag: #ffiLongVsInt;
+ assert: (self argTypesAt: #ffiTestBool:with:with:with:)
+ equals: (Array new: 5 withAll: ExternalType bool).!

Item was added:
+ ----- Method: FFITypeNameTests>>testAtomicChar (in category 'tests') -----
+ testAtomicChar
+
+ self
+ flag: #ffiLongVsInt;
+ assert: (self argTypesAt: #ffiTestChar:with:with:with:)
+ equals: (Array new: 5 withAll: ExternalType char).!

Item was added:
+ ----- Method: FFITypeNameTests>>testAtomicCharPointer (in category 'tests') -----
+ testAtomicCharPointer
+
+ self
+ assert: (self argTypesAt: #ffiPrintString:)
+ equals: (Array new: 2 withAll: ExternalType char asPointerType).!

Item was added:
+ ----- Method: FFITypeNameTests>>testAtomicDouble (in category 'tests') -----
+ testAtomicDouble
+
+ self
+ assert: (self argTypesAt: #ffiTestDoubles:with:)
+ equals: (Array new: 3 withAll: ExternalType double).!

Item was added:
+ ----- Method: FFITypeNameTests>>testAtomicFloat (in category 'tests') -----
+ testAtomicFloat
+
+ self
+ assert: (self argTypesAt: #ffiTestFloats:with:)
+ equals: (Array new: 3 withAll: ExternalType float).!

Item was added:
+ ----- Method: FFITypeNameTests>>testAtomicInt (in category 'tests') -----
+ testAtomicInt
+
+ self
+ flag: #ffiLongVsInt;
+ assert: (self argTypesAt: #ffiTestInt:with:with:with:)
+ equals: (Array new: 5 withAll: ExternalType int).!

Item was added:
+ ----- Method: FFITypeNameTests>>testAtomicLong (in category 'tests') -----
+ testAtomicLong
+
+ self
+ flag: #ffiLongVsInt;
+ assert: (self argTypesAt: #ffiTestLong:with:with:with:)
+ equals: (Array new: 5 withAll: ExternalType long).!

Item was added:
+ ----- Method: FFITypeNameTests>>testAtomicLongLong (in category 'tests') -----
+ testAtomicLongLong
+
+ self
+ assert: (self argTypesAt: #ffiTestLongLong:with:)
+ equals: (Array new: 3 withAll: ExternalType longlong).!

Item was added:
+ ----- Method: FFITypeNameTests>>testAtomicString (in category 'tests') -----
+ testAtomicString
+
+ self
+ assert: (self argTypesAt: #ffiPrintString:)
+ equals: (Array new: 2 withAll: ExternalType string).!

Item was added:
+ ----- Method: FFITypeNameTests>>testAtomicUint (in category 'tests') -----
+ testAtomicUint
+
+ self
+ flag: #ffiLongVsInt;
+ assert: (self argTypesAt: #ffiTestUint:with:with:with:) allButFirst
+ equals: (Array new: 4 withAll: ExternalType uint).!

Item was added:
+ ----- Method: FFITypeNameTests>>testAtomicUlong (in category 'tests') -----
+ testAtomicUlong
+
+ self
+ flag: #ffiLongVsInt;
+ assert: (self argTypesAt: #ffiTestUlong:with:with:with:) allButFirst
+ equals: (Array new: 4 withAll: ExternalType ulong).!

Item was added:
+ ----- Method: FFITypeNameTests>>testAtomicVoid (in category 'tests') -----
+ testAtomicVoid
+ "Only test for return type since argument 'void' means 'no argument' in C."
+
+ self
+ assert: (self argTypesAt: #ffiTestVoid)
+ equals: {ExternalType void}.!

Item was added:
+ ----- Method: FFITypeNameTests>>testAtomicVoidPointer (in category 'tests') -----
+ testAtomicVoidPointer
+
+ self
+ assert: (self argTypesAt: #ffiTestVoidPointer)
+ equals: (Array new: 2 withAll: ExternalType void asPointerType).!

Item was added:
+ ----- Method: FFITypeNameTests>>testStruct (in category 'tests') -----
+ testStruct
+
+ self
+ assert: (self argTypesAt: #ffiTestPoint2:with:)
+ equals: (Array new: 3 withAll: FFITestPoint2 externalType).!

Item was added:
+ ----- Method: FFITypeNameTests>>testStructPointer (in category 'tests') -----
+ testStructPointer
+
+ self
+ assert: (self argTypesAt: #ffiTestPointers:with:)
+ equals: (Array new: 3 withAll: FFITestPoint4 externalType asPointerType).!