libs-base/Tests/base/NSProxy/test01.m
2024-11-16 21:11:56 +00:00

258 lines
7.4 KiB
Objective-C

#define _GNU_SOURCE
#define _ISOC99_SOURCE
#import <Foundation/Foundation.h>
#import "Testing.h"
#include <limits.h>
typedef struct _GSFinePoint GSFinePoint;
struct _GSFinePoint
{
double x;
double y;
};
GSFinePoint
GSMakeFinePoint(double x, double y)
{
GSFinePoint point;
point.x = x;
point.y = y;
return point;
}
BOOL
GSEqualFinePoints(GSFinePoint aPoint, GSFinePoint bPoint)
{
return ((aPoint.x == bPoint.x)
&& (aPoint.y == bPoint.y)) ? YES : NO;
}
typedef struct _GSBitField GSBitField;
struct _GSBitField
{
unsigned int first:1;
unsigned int unused:1;
unsigned int second:1;
};
GSBitField
GSMakeBitField(BOOL first, BOOL second)
{
GSBitField field;
field.first = first;
field.second = second;
return field;
}
BOOL
GSEqualBitFields(GSBitField aField, GSBitField bField)
{
return ((aField.first == bField.first)
&& (aField.second == bField.second)) ? YES : NO;
}
NSDecimal
GSMakeDecimal(unsigned long long mantissa, short exponent, BOOL negative)
{
NSDecimalNumber *d;
NSDecimal dec;
d = [NSDecimalNumber decimalNumberWithMantissa: mantissa
exponent: exponent
isNegative: negative];
dec = [d decimalValue];
return dec;
}
NSDecimal
GSDecimalMultiply(NSDecimal left,NSDecimal right)
{
NSDecimal dec;
NSDecimalMultiply(&dec,&left,&right,NSRoundPlain);
return dec;
}
BOOL
GSDecimalCompare(NSDecimal left,NSDecimal right)
{
return NSDecimalCompare(&left,&right);
}
@interface TypeTester : NSObject
{
}
-(void)voidPvoid;
-(signed char)sCharPsChar:(signed char)v;
-(unsigned char)uCharPuChar:(unsigned char)v;
-(short)shortPshort:(short)v;
-(unsigned short)uShortPuShort:(unsigned short)v;
-(int)intPint:(int)v;
-(unsigned int)uIntPuInt:(unsigned int)v;
-(long)longPlong:(long)v;
-(unsigned long)uLongPuLong:(unsigned long)v;
-(long long)longlongPlonglong:(long long)v;
-(unsigned long long)ulonglongPulonglong:(unsigned long long)v;
-(float)floatPfloat:(float)v;
-(double)doublePdouble:(double)v;
-(long double)longdoublePlongdouble:(long double)v;
-(id)idPid:(id)v;
-(NSStringEncoding)enumPenum:(NSStringEncoding)v;
-(NSRange)rangePrange:(NSRange)v;
-(NSPoint)pointPpoint:(NSPoint)v;
-(NSDecimal)decimalPdecimal:(NSDecimal)v;
-(GSFinePoint)finePointPfinePoint:(GSFinePoint)v;
-(GSBitField)bitFieldPbitField:(GSBitField)v;
@end
@implementation TypeTester
-(void)voidPvoid {}
-(signed char)sCharPsChar:(signed char)v { return v - 1; }
-(unsigned char)uCharPuChar:(unsigned char)v { return v - 1; }
-(short)shortPshort:(short)v { return v - 1; }
-(unsigned short)uShortPuShort:(unsigned short)v { return v - 1; }
-(int)intPint:(int)v { return v - 1; }
-(unsigned int)uIntPuInt:(unsigned int)v { return v - 1; }
-(long)longPlong:(long)v { return v - 1; }
-(unsigned long)uLongPuLong:(unsigned long)v { return v - 1; }
-(long long)longlongPlonglong:(long long)v { return v - 1; }
-(unsigned long long)ulonglongPulonglong:(unsigned long long)v { return v - 1; }
-(float)floatPfloat:(float)v { return v - 1.0; }
-(double)doublePdouble:(double)v { return v - 1.0; }
-(long double)longdoublePlongdouble:(long double)v { return v - 1.0; }
-(id)idPid:(id)v { return v == [NSProcessInfo processInfo] ? [NSNull null] : nil; }
-(NSStringEncoding)enumPenum:(NSStringEncoding)v { return v == NSSymbolStringEncoding ? NSNEXTSTEPStringEncoding : 0; }
-(NSRange)rangePrange:(NSRange)v { return NSMakeRange(v.length,v.location); }
-(NSPoint)pointPpoint:(NSPoint)v { return NSMakePoint(v.y,v.x); }
-(NSDecimal)decimalPdecimal:(NSDecimal)v { return GSDecimalMultiply(v,v); }
-(GSFinePoint)finePointPfinePoint:(GSFinePoint)v { return GSMakeFinePoint((double)v.y,(double)v.x); }
-(GSBitField)bitFieldPbitField:(GSBitField)v { return GSMakeBitField(v.second,v.first); }
@end
@interface MyProxy : NSProxy
{
id _remote;
}
@end
@implementation MyProxy
-(id) init
{
_remote = nil;
return self;
}
- (void) dealloc
{
[_remote release];
DEALLOC
}
-(void) setRemote:(id)remote
{
ASSIGN(_remote,remote);
}
-(NSString *) description
{
return [_remote description];
}
-(id) remote
{
return _remote;
}
- (NSMethodSignature *) methodSignatureForSelector:(SEL)aSelector
{
NSMethodSignature *sig = [_remote methodSignatureForSelector:aSelector];
if (sig == nil)
sig = [self methodSignatureForSelector:aSelector];
return sig;
}
- (void) forwardInvocation:(NSInvocation *)inv
{
[inv setTarget:_remote];
[inv invoke];
}
@end
int
main(int argc, char *argv[])
{
NSAutoreleasePool *arp = [NSAutoreleasePool new];
id obj = nil;
id rem = [TypeTester new];
GSFinePoint f0;
GSFinePoint f1;
NSPoint p0;
NSPoint p1;
NSRange r0;
NSRange r1;
obj = AUTORELEASE([[MyProxy alloc] init]);
[obj setRemote:rem];
[obj voidPvoid]; //shoudn't raise
PASS([obj sCharPsChar: 128] == 127, "Proxy signed char")
PASS([obj uCharPuChar: 255] == 254, "Proxy unsigned char")
PASS([obj shortPshort: SHRT_MAX] == (SHRT_MAX - 1), "Proxy signed short")
PASS([obj uShortPuShort: USHRT_MAX] == (USHRT_MAX - 1),
"Proxy unsigned short");
PASS([obj intPint: INT_MAX] == (INT_MAX - 1),
"Proxy signed int")
PASS([obj uIntPuInt: UINT_MAX] == (UINT_MAX - 1U),
"Proxy unsigned int")
PASS([obj longPlong: LONG_MAX] == (LONG_MAX - 1L),
"Proxy signed long")
PASS([obj uLongPuLong: ULONG_MAX] == (ULONG_MAX - 1UL),
"Proxy unsigned long")
pass([obj longlongPlonglong: LLONG_MAX] == (LLONG_MAX - 1LL),
"Proxy signed long long");
PASS([obj ulonglongPulonglong: ULLONG_MAX] == (ULLONG_MAX - 1ULL),
"Proxy unsigned long long")
pass([obj floatPfloat: (float)3.14] == ((float)3.14 - (float)1.0),
"Proxy float");
pass([obj doublePdouble: (double)3.14] == ((double)3.14 - (double)1.0),
"Proxy double");
PASS([obj idPid: [NSProcessInfo processInfo]] == [NSNull null],
"Proxy id")
PASS([obj enumPenum: NSSymbolStringEncoding] == NSNEXTSTEPStringEncoding,
"Proxy enum")
r0 = [obj rangePrange: NSMakeRange(243,437)];
r1 = NSMakeRange(437,243);
PASS(NSEqualRanges(r0, r1), "Proxy NSRange")
p0 = [obj pointPpoint: NSMakePoint(243.0F,437.0F)];
p1 = NSMakePoint(437.0F,243.0F);
PASS(NSEqualPoints(p0, p1), "Proxy NSPoint")
f0 = [obj finePointPfinePoint: GSMakeFinePoint(243.0L,437.0L)];
f1 = GSMakeFinePoint(437.0L,243.0L);
PASS(GSEqualFinePoints(f0, f1), "Proxy GSFinePoint")
#if 0
/* These next two are disabled because they test passing structures as
* parameters, a feature which has never worked and which maybe doesn't
* need to.
* We should enable these tests if/when the capability is ever implemented.
*/
BOOL ok;
ok = GSDecimalCompare([obj decimalPdecimal: GSMakeDecimal(321,7,YES)],
GSDecimalMultiply(GSMakeDecimal(321,7,YES),GSMakeDecimal(321,7,YES)))==0;
PASS(ok, "Proxy NSDecimal")
#endif
#if 0
/*
Disabled since this currently causes segfaults. Yet this feature is hardly ever used.
Note also: file:///usr/share/doc/libffi-dev/html/Missing-Features.html#Missing-Features:
libffi is missing a few features. We welcome patches to add support for these.
* There is no support for calling varargs functions. This may work on some platforms, depending on how the ABI is defined, but it is not reliable.
* There is no support for bit fields in structures.
* The closure API is
* The raw” API is undocumented.
*/
PASS(GSEqualBitFields([obj bitFieldPbitField: GSMakeBitField(0,1)],GSMakeBitField(1,0)), "Proxy GSBitField")
#endif
[arp release]; arp = nil;
return 0;
}