mirror of
https://github.com/gnustep/libs-base.git
synced 2025-05-31 00:30:53 +00:00
import testsuite
git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@32187 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
parent
734c214892
commit
0e02133729
374 changed files with 20864 additions and 0 deletions
21
Tests/base/NSRunLoop/basic.m
Normal file
21
Tests/base/NSRunLoop/basic.m
Normal file
|
@ -0,0 +1,21 @@
|
|||
#import "ObjectTesting.h"
|
||||
#import <Foundation/NSRunLoop.h>
|
||||
#import <Foundation/NSTimer.h>
|
||||
#import <Foundation/NSAutoreleasePool.h>
|
||||
|
||||
int main()
|
||||
{
|
||||
NSAutoreleasePool *arp = [NSAutoreleasePool new];
|
||||
id testObj;
|
||||
|
||||
PASS([NSRunLoop new] == nil, "run loop initialises to nil");
|
||||
testObj = [NSRunLoop currentRunLoop];
|
||||
test_NSObject(@"NSRunLoop", [NSArray arrayWithObject:testObj]);
|
||||
|
||||
PASS([NSTimer new] == nil, "timer initialises to nil");
|
||||
ASSIGN(testObj, [[NSTimer alloc] initWithFireDate: 0 interval: 0 target: [NSObject class] selector: @selector(description) userInfo: nil repeats: NO]);
|
||||
test_NSObject(@"NSTimer", [NSArray arrayWithObject:testObj]);
|
||||
|
||||
[arp release]; arp = nil;
|
||||
return 0;
|
||||
}
|
36
Tests/base/NSRunLoop/general.m
Normal file
36
Tests/base/NSRunLoop/general.m
Normal file
|
@ -0,0 +1,36 @@
|
|||
#import "ObjectTesting.h"
|
||||
#import <Foundation/NSAutoreleasePool.h>
|
||||
#import <Foundation/NSInvocation.h>
|
||||
#import <Foundation/NSRunLoop.h>
|
||||
#import <Foundation/NSTimer.h>
|
||||
|
||||
int main()
|
||||
{
|
||||
NSAutoreleasePool *arp = [NSAutoreleasePool new];
|
||||
NSMethodSignature *sig;
|
||||
NSInvocation *inv;
|
||||
NSTimer *tim;
|
||||
NSRunLoop *run;
|
||||
NSDate *date;
|
||||
|
||||
sig = [NSTimer instanceMethodSignatureForSelector:@selector(isValid)];
|
||||
inv = [NSInvocation invocationWithMethodSignature: sig];
|
||||
|
||||
run = [NSRunLoop currentRunLoop];
|
||||
PASS(run != nil, "NSRunLoop understands [+currentRunLoop]");
|
||||
PASS([run currentMode] == nil, "-currentMode returns nil");
|
||||
|
||||
TEST_EXCEPTION(date = [NSDate dateWithTimeIntervalSinceNow:3];
|
||||
[run runUntilDate:date];,
|
||||
nil,NO,"-runUntilDate: works");
|
||||
TEST_EXCEPTION(date = [NSDate dateWithTimeIntervalSinceNow:5];
|
||||
tim = [NSTimer scheduledTimerWithTimeInterval: 2.0
|
||||
invocation:inv
|
||||
repeats:YES];,
|
||||
nil,NO,"-runUntilDate: works with a timer");
|
||||
|
||||
|
||||
|
||||
[arp release]; arp = nil;
|
||||
return 0;
|
||||
}
|
111
Tests/base/NSRunLoop/performers.m
Normal file
111
Tests/base/NSRunLoop/performers.m
Normal file
|
@ -0,0 +1,111 @@
|
|||
#import "Testing.h"
|
||||
#import <Foundation/NSAutoreleasePool.h>
|
||||
#import <Foundation/NSDate.h>
|
||||
#import <Foundation/NSRunLoop.h>
|
||||
#import <Foundation/NSString.h>
|
||||
#import <Foundation/NSArray.h>
|
||||
#import <Foundation/NSFileHandle.h>
|
||||
|
||||
#include <unistd.h>
|
||||
|
||||
int main()
|
||||
{
|
||||
NSAutoreleasePool *arp = [NSAutoreleasePool new];
|
||||
NSRunLoop *run;
|
||||
NSDate *date;
|
||||
NSMutableString *str;
|
||||
NSFileHandle *fh = [NSFileHandle fileHandleWithStandardInput];
|
||||
|
||||
[fh retain];
|
||||
[fh readInBackgroundAndNotify];
|
||||
|
||||
run = [NSRunLoop currentRunLoop];
|
||||
|
||||
/* A run loop with no input sources does nothing when you tell it to run.
|
||||
Thus, we need to provide at least one input source ... */
|
||||
|
||||
str = [[NSMutableString alloc] init];
|
||||
[run performSelector: @selector(appendString:)
|
||||
target: str
|
||||
argument: @"foo"
|
||||
order: 0
|
||||
modes: [NSArray arrayWithObject: NSDefaultRunLoopMode]];
|
||||
date = [NSDate dateWithTimeIntervalSinceNow: 0.1];
|
||||
[run runUntilDate: date];
|
||||
PASS([str isEqual: @"foo"],
|
||||
"-performSelector:target:argument:order:modes: works for one performer");
|
||||
|
||||
str = [[NSMutableString alloc] init];
|
||||
[run performSelector: @selector(appendString:)
|
||||
target: str
|
||||
argument: @"foo"
|
||||
order: 0
|
||||
modes: [NSArray arrayWithObject: NSDefaultRunLoopMode]];
|
||||
date = [NSDate dateWithTimeIntervalSinceNow: 0.1];
|
||||
[run runUntilDate: date];
|
||||
[run runUntilDate: date];
|
||||
PASS([str isEqual: @"foo"],
|
||||
"-performSelector:target:argument:order:modes: only sends the message once");
|
||||
|
||||
str = [[NSMutableString alloc] init];
|
||||
[run performSelector: @selector(appendString:)
|
||||
target: str
|
||||
argument: @"bar"
|
||||
order: 11
|
||||
modes: [NSArray arrayWithObject: NSDefaultRunLoopMode]];
|
||||
[run performSelector: @selector(appendString:)
|
||||
target: str
|
||||
argument: @"foo"
|
||||
order: 10
|
||||
modes: [NSArray arrayWithObject: NSDefaultRunLoopMode]];
|
||||
date = [NSDate dateWithTimeIntervalSinceNow: 0.1];
|
||||
[run runUntilDate: date];
|
||||
PASS([str isEqual: @"foobar"],
|
||||
"-performSelector:target:argument:order:modes: orders performers correctly");
|
||||
|
||||
str = [[NSMutableString alloc] init];
|
||||
[run performSelector: @selector(appendString:)
|
||||
target: str
|
||||
argument: @"foo"
|
||||
order: 10
|
||||
modes: [NSArray arrayWithObject: NSDefaultRunLoopMode]];
|
||||
[run performSelector: @selector(appendString:)
|
||||
target: str
|
||||
argument: @"bar"
|
||||
order: 11
|
||||
modes: [NSArray arrayWithObject: NSDefaultRunLoopMode]];
|
||||
[run performSelector: @selector(appendString:)
|
||||
target: str
|
||||
argument: @"zot"
|
||||
order: 11
|
||||
modes: [NSArray arrayWithObject: NSDefaultRunLoopMode]];
|
||||
[run cancelPerformSelector: @selector(appendString:)
|
||||
target: str
|
||||
argument: @"bar"];
|
||||
date = [NSDate dateWithTimeIntervalSinceNow: 0.1];
|
||||
[run runUntilDate: date];
|
||||
PASS([str isEqual: @"foozot"],
|
||||
"-cancelPerformSelector:target:argument: works");
|
||||
|
||||
str = [[NSMutableString alloc] init];
|
||||
[run performSelector: @selector(appendString:)
|
||||
target: str
|
||||
argument: @"foo"
|
||||
order: 10
|
||||
modes: [NSArray arrayWithObject: NSDefaultRunLoopMode]];
|
||||
[run performSelector: @selector(appendString:)
|
||||
target: str
|
||||
argument: @"zot"
|
||||
order: 11
|
||||
modes: [NSArray arrayWithObject: NSDefaultRunLoopMode]];
|
||||
[run cancelPerformSelectorsWithTarget: str];
|
||||
date = [NSDate dateWithTimeIntervalSinceNow: 0.1];
|
||||
[run runUntilDate: date];
|
||||
PASS([str isEqualToString: @""], "-cancelPerformSelectorsWithTarget: works %s",[str cString]);
|
||||
|
||||
[fh closeFile];
|
||||
[fh release];
|
||||
|
||||
[arp release]; arp = nil;
|
||||
return 0;
|
||||
}
|
201
Tests/base/NSRunLoop/thread.m
Normal file
201
Tests/base/NSRunLoop/thread.m
Normal file
|
@ -0,0 +1,201 @@
|
|||
#import "ObjectTesting.h"
|
||||
|
||||
#import <Foundation/NSAutoreleasePool.h>
|
||||
#import <Foundation/NSObject.h>
|
||||
#import <Foundation/NSFileHandle.h>
|
||||
#import <Foundation/NSThread.h>
|
||||
#import <Foundation/NSTimer.h>
|
||||
#import <Foundation/NSRunLoop.h>
|
||||
|
||||
@interface ThreadTest : NSObject {
|
||||
char acceptEmptyBlocks;
|
||||
char acceptTimerBlocks;
|
||||
char blockForEmpty;
|
||||
char blockForInput;
|
||||
char blockForTimer;
|
||||
char limitForEmpty;
|
||||
char limitForInput;
|
||||
char limitForTimer;
|
||||
char moreForEmpty;
|
||||
char moreForInput;
|
||||
char moreForTimer;
|
||||
char performed;
|
||||
}
|
||||
- (void) timeout: (NSTimer*)t;
|
||||
- (void) thread1: (id)o;
|
||||
@end
|
||||
|
||||
@implementation ThreadTest
|
||||
|
||||
- (void) timeout: (NSTimer*)t
|
||||
{
|
||||
}
|
||||
|
||||
- (void) thread1: (id)o
|
||||
{
|
||||
NSAutoreleasePool *pool = [NSAutoreleasePool new];
|
||||
NSRunLoop *loop;
|
||||
NSFileHandle *fh;
|
||||
NSTimer *timer;
|
||||
NSDate *end;
|
||||
NSDate *start;
|
||||
|
||||
loop = [NSRunLoop currentRunLoop];
|
||||
|
||||
end = [loop limitDateForMode: NSDefaultRunLoopMode];
|
||||
if (end == nil)
|
||||
limitForEmpty = 'N';
|
||||
else
|
||||
limitForEmpty = 'Y';
|
||||
|
||||
end = [NSDate dateWithTimeIntervalSinceNow: 0.2];
|
||||
start = [NSDate date];
|
||||
if ([loop runMode: NSDefaultRunLoopMode beforeDate: end] == YES)
|
||||
moreForEmpty = 'Y';
|
||||
else
|
||||
moreForEmpty = 'N';
|
||||
if (fabs([start timeIntervalSinceNow]) < 0.01)
|
||||
blockForEmpty = 'N';
|
||||
else
|
||||
blockForEmpty = 'Y';
|
||||
|
||||
end = [NSDate dateWithTimeIntervalSinceNow: 0.2];
|
||||
start = [NSDate date];
|
||||
[loop acceptInputForMode: NSDefaultRunLoopMode beforeDate: end];
|
||||
if (fabs([start timeIntervalSinceNow]) < 0.01)
|
||||
acceptEmptyBlocks = 'N';
|
||||
else
|
||||
acceptEmptyBlocks = 'Y';
|
||||
|
||||
timer = [NSTimer timerWithTimeInterval: 2.0
|
||||
target: self
|
||||
selector: @selector(timeout:)
|
||||
userInfo: nil
|
||||
repeats: NO];
|
||||
[loop addTimer: timer forMode: NSDefaultRunLoopMode];
|
||||
end = [loop limitDateForMode: NSDefaultRunLoopMode];
|
||||
if (fabs([end timeIntervalSinceDate: [timer fireDate]]) < 0.01)
|
||||
limitForTimer = 'Y';
|
||||
else
|
||||
limitForTimer = 'N';
|
||||
end = [NSDate dateWithTimeIntervalSinceNow: 0.2];
|
||||
start = [NSDate date];
|
||||
if ([loop runMode: NSDefaultRunLoopMode beforeDate: end] == YES)
|
||||
moreForTimer = 'Y';
|
||||
else
|
||||
moreForTimer = 'N';
|
||||
if (fabs([start timeIntervalSinceNow]) < 0.01)
|
||||
blockForTimer = 'N';
|
||||
else
|
||||
blockForTimer = 'Y';
|
||||
|
||||
end = [NSDate dateWithTimeIntervalSinceNow: 0.2];
|
||||
start = [NSDate date];
|
||||
[loop acceptInputForMode: NSDefaultRunLoopMode beforeDate: end];
|
||||
if (fabs([start timeIntervalSinceNow]) < 0.01)
|
||||
acceptTimerBlocks = 'N';
|
||||
else
|
||||
acceptTimerBlocks = 'Y';
|
||||
|
||||
[timer invalidate];
|
||||
|
||||
fh = [NSFileHandle fileHandleWithStandardInput];
|
||||
[fh readInBackgroundAndNotify];
|
||||
end = [loop limitDateForMode: NSDefaultRunLoopMode];
|
||||
if ([end isEqual: [NSDate distantFuture]] == YES)
|
||||
limitForInput = 'Y';
|
||||
else
|
||||
limitForInput = 'N';
|
||||
end = [NSDate dateWithTimeIntervalSinceNow: 0.2];
|
||||
start = [NSDate date];
|
||||
if ([loop runMode: NSDefaultRunLoopMode beforeDate: end] == YES)
|
||||
moreForInput = 'Y';
|
||||
else
|
||||
moreForInput = 'N';
|
||||
[timer invalidate];
|
||||
if (fabs([start timeIntervalSinceNow]) < 0.01)
|
||||
blockForInput = 'N';
|
||||
else
|
||||
blockForInput = 'Y';
|
||||
|
||||
[pool release];
|
||||
}
|
||||
|
||||
- (void) thread2: (id)o
|
||||
{
|
||||
NSAutoreleasePool *pool = [NSAutoreleasePool new];
|
||||
NSRunLoop *loop;
|
||||
NSDate *end;
|
||||
|
||||
loop = [NSRunLoop currentRunLoop];
|
||||
|
||||
[NSTimer scheduledTimerWithTimeInterval: 2.0
|
||||
target: self
|
||||
selector: @selector(timeout:)
|
||||
userInfo: nil
|
||||
repeats: NO];
|
||||
|
||||
end = [NSDate dateWithTimeIntervalSinceNow: 2.0];
|
||||
while ([end timeIntervalSinceNow] > 0)
|
||||
{
|
||||
[loop runUntilDate: end];
|
||||
}
|
||||
[pool release];
|
||||
}
|
||||
|
||||
- (void) threadEvent: (id)ignored
|
||||
{
|
||||
performed = 'Y';
|
||||
}
|
||||
|
||||
- (void) run
|
||||
{
|
||||
NSDate *until = [NSDate dateWithTimeIntervalSinceNow: 5.0];
|
||||
NSThread *t;
|
||||
|
||||
[NSTimer scheduledTimerWithTimeInterval: 5.0
|
||||
target: self
|
||||
selector: @selector(timeout:)
|
||||
userInfo: nil
|
||||
repeats: YES];
|
||||
|
||||
[NSThread detachNewThreadSelector: @selector(thread1:)
|
||||
toTarget: self
|
||||
withObject: nil];
|
||||
t = [[NSThread alloc] initWithTarget: self
|
||||
selector: @selector(thread2:)
|
||||
object: nil];
|
||||
[t start];
|
||||
|
||||
[self performSelector: @selector(threadEvent:)
|
||||
onThread: t
|
||||
withObject: nil
|
||||
waitUntilDone: NO];
|
||||
while ([until timeIntervalSinceNow] > 0)
|
||||
{
|
||||
[[NSRunLoop currentRunLoop] runUntilDate: until];
|
||||
}
|
||||
|
||||
PASS(acceptEmptyBlocks == 'N', "Accept with no inputs or timers will exit");
|
||||
PASS(acceptTimerBlocks == 'Y', "Accept with timers will not exit");
|
||||
PASS(blockForEmpty == 'N', "A loop with no inputs or timers will exit");
|
||||
PASS(blockForInput == 'Y', "A loop with an input source will block");
|
||||
PASS(blockForTimer == 'Y', "A loop with a timer will block");
|
||||
PASS(limitForEmpty == 'N', "A loop with no inputs or timers has no limit");
|
||||
PASS(limitForInput == 'Y', "A loop with an input source has distant future");
|
||||
PASS(limitForTimer == 'Y', "A loop with a timer has timer fire date");
|
||||
PASS(moreForEmpty == 'N', "A loop with no inputs or timers has no more");
|
||||
PASS(moreForInput == 'Y', "A loop with an input source has more");
|
||||
PASS(moreForTimer == 'Y', "A loop with a timer has more");
|
||||
PASS(performed == 'Y', "Methods will be performed in a loop without inputs");
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
NSAutoreleasePool *pool = [NSAutoreleasePool new];
|
||||
[[[ThreadTest new] autorelease] run];
|
||||
[pool release];
|
||||
return 0;
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue