mirror of https://github.com/oxen-io/session-ios
				
				
				
			
			You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			135 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			Objective-C
		
	
			
		
		
	
	
			135 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			Objective-C
		
	
| #import <XCTest/XCTest.h>
 | |
| #import "ObservableValue.h"
 | |
| #import "TestUtil.h"
 | |
| 
 | |
| @interface ObservableTest : XCTestCase
 | |
| @end
 | |
| 
 | |
| @implementation ObservableTest
 | |
| 
 | |
| -(void) testObservableAddRemove {
 | |
|     ObservableValueController* s = [ObservableValueController observableValueControllerWithInitialValue:@""];
 | |
|     ObservableValue* t = s;
 | |
|     NSMutableArray* a = [NSMutableArray array];
 | |
|     TOCCancelTokenSource* c = [TOCCancelTokenSource new];
 | |
|     
 | |
|     [t watchLatestValueOnArbitraryThread:^(id value) {[a addObject:value];}
 | |
|                           untilCancelled:c.token];
 | |
|     
 | |
|     test([a isEqualToArray:@[@""]]);
 | |
|     [s updateValue:@5];
 | |
|     test([a isEqualToArray:(@[@"", @5])]);
 | |
|     [s updateValue:@7];
 | |
|     test([a isEqualToArray:(@[@"", @5, @7])]);
 | |
|     [c cancel];
 | |
|     [s updateValue:@11];
 | |
|     test([a isEqualToArray:(@[@"", @5, @7])]);
 | |
| }
 | |
| -(void) testObservableAddAdd {
 | |
|     ObservableValueController* s = [ObservableValueController observableValueControllerWithInitialValue:@""];
 | |
|     ObservableValue* t = s;
 | |
|     NSMutableArray* a = [NSMutableArray array];
 | |
|     TOCCancelTokenSource* c = [TOCCancelTokenSource new];
 | |
|     
 | |
|     [t watchLatestValueOnArbitraryThread:^(id value) {[a addObject:value];}
 | |
|                           untilCancelled:c.token];
 | |
|     [t watchLatestValueOnArbitraryThread:^(id value) {[a addObject:value];}
 | |
|                           untilCancelled:c.token];
 | |
|     [t watchLatestValueOnArbitraryThread:^(id value) {[a addObject:value];}
 | |
|                           untilCancelled:c.token];
 | |
|     
 | |
|     test([a isEqualToArray:(@[@"", @"", @""])]);
 | |
|     [s updateValue:@5];
 | |
|     test([a isEqualToArray:(@[@"", @"", @"", @5, @5, @5])]);
 | |
| }
 | |
| -(void) testObservableRedundantSetIgnored {
 | |
|     id v1 = @"";
 | |
|     id v2 = nil;
 | |
|     id v3 = @1;
 | |
|     
 | |
|     ObservableValueController* s = [ObservableValueController observableValueControllerWithInitialValue:v1];
 | |
|     ObservableValue* t = s;
 | |
|     __block id latest = nil;
 | |
|     __block int count = 0;
 | |
|     [t watchLatestValueOnArbitraryThread:^(id value) {latest = value;count++;}
 | |
|                           untilCancelled:nil];
 | |
| 
 | |
|     test(latest == v1);
 | |
|     test(count == 1);
 | |
| 
 | |
|     [s updateValue:v1];
 | |
|     test(latest == v1);
 | |
|     test(count == 1);
 | |
|     
 | |
|     [s updateValue:v2];
 | |
|     test(latest == v2);
 | |
|     test(count == 2);
 | |
|     
 | |
|     [s updateValue:v2];
 | |
|     test(latest == v2);
 | |
|     test(count == 2);
 | |
| 
 | |
|     [s updateValue:v1];
 | |
|     test(latest == v1);
 | |
|     test(count == 3);
 | |
|     
 | |
|     [s updateValue:v3];
 | |
|     test(latest == v3);
 | |
|     test(count == 4);
 | |
| }
 | |
| -(void) testObservableReentrantAdd {
 | |
|     ObservableValueController* s = [ObservableValueController observableValueControllerWithInitialValue:@""];
 | |
|     ObservableValue* t = s;
 | |
|     NSMutableArray* a = [NSMutableArray array];
 | |
|     TOCCancelTokenSource* c = [TOCCancelTokenSource new];
 | |
|     
 | |
|     __block void(^registerSelf)() = nil;
 | |
|     void(^registerSelf_builder)() = ^{
 | |
|         __block bool first = true;
 | |
|         [t watchLatestValueOnArbitraryThread:^(id value) {
 | |
|             if (!first) registerSelf();
 | |
|             first = false;
 | |
|             [a addObject:value];
 | |
|         } untilCancelled:c.token];
 | |
|     };
 | |
|     registerSelf = [registerSelf_builder copy];
 | |
|     registerSelf();
 | |
|     
 | |
|     // adding during a callback counts as adding after the callback
 | |
|     // so we should see a doubling each time
 | |
|     test([a isEqualToArray:@[@""]]);
 | |
|     [s updateValue:@1];
 | |
|     test([a isEqualToArray:(@[@"", @1, @1])]);
 | |
|     [s updateValue:@2];
 | |
|     test([a isEqualToArray:(@[@"", @1, @1, @2, @2, @2, @2])]);
 | |
|     [s updateValue:@3];
 | |
|     test([a isEqualToArray:(@[@"", @1, @1, @2, @2, @2, @2, @3, @3, @3, @3, @3, @3, @3, @3])]);
 | |
| }
 | |
| -(void) testObservableReentrantRemove {
 | |
|     ObservableValueController* s = [ObservableValueController observableValueControllerWithInitialValue:@""];
 | |
|     ObservableValue* t = s;
 | |
|     NSMutableArray* a = [NSMutableArray array];
 | |
|     TOCCancelTokenSource* c = [TOCCancelTokenSource new];
 | |
|     
 | |
|     for (int i = 0; i < 3; i++) {
 | |
|         __block bool first = true;
 | |
|         [t watchLatestValueOnArbitraryThread:^(id value) {
 | |
|             if (!first) {
 | |
|                 [c cancel];
 | |
|                 [a addObject:value];
 | |
|             }
 | |
|             first = false;
 | |
|         } untilCancelled:c.token];
 | |
|     }
 | |
|     
 | |
|     // removing during a callback counts as removing after the callback
 | |
|     // so we should see all the callbacks run, then they're all cancelled
 | |
|     test([a isEqualToArray:(@[])]);
 | |
|     [s updateValue:@1];
 | |
|     test([a isEqualToArray:(@[@1, @1, @1])]);
 | |
|     [s updateValue:@2];
 | |
|     test([a isEqualToArray:(@[@1, @1, @1])]);
 | |
| }
 | |
| 
 | |
| @end
 |