Skip to content
Snippets Groups Projects
Commit 081ad45c authored by Jason Gavris's avatar Jason Gavris
Browse files

Swizzle out NSUserDefaults in PTYTextViewTests

parent 47341ead
No related branches found
No related tags found
No related merge requests found
Loading
Loading
@@ -1620,6 +1620,7 @@
A6FD85311B767D6300EB9DCE /* Hamburger@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A6FD852F1B767D6300EB9DCE /* Hamburger@2x.png */; };
A6FD85341B768B7800EB9DCE /* BigArrow.png in Resources */ = {isa = PBXBuildFile; fileRef = A6FD85321B768B7800EB9DCE /* BigArrow.png */; };
A6FD85351B768B7800EB9DCE /* BigArrow@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = A6FD85331B768B7800EB9DCE /* BigArrow@2x.png */; };
C6675EBC1C4FE96B0041173B /* iTermSelectorSwizzler.m in Sources */ = {isa = PBXBuildFile; fileRef = C6675EBB1C4FE96B0041173B /* iTermSelectorSwizzler.m */; };
D3CE2D4E1A00936F0098ED99 /* PSMDarkTabStyle.h in Headers */ = {isa = PBXBuildFile; fileRef = D3CE2D4C1A00936F0098ED99 /* PSMDarkTabStyle.h */; };
DDF0FD65062916F70080EF74 /* iTermApplication.h in Headers */ = {isa = PBXBuildFile; fileRef = DDF0FD63062916F70080EF74 /* iTermApplication.h */; };
FB4CEC973C7E9235362E3F26 /* iTermRemotePreferences.h in Headers */ = {isa = PBXBuildFile; fileRef = FB4CECF4AC4392B21E87A07B /* iTermRemotePreferences.h */; };
Loading
Loading
@@ -2681,6 +2682,8 @@
A6FD85331B768B7800EB9DCE /* BigArrow@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "BigArrow@2x.png"; path = "images/BigArrow@2x.png"; sourceTree = "<group>"; };
AA2D5DC026C5FC41EB420E90 /* Pods-iTerm2XCTests.deployment.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-iTerm2XCTests.deployment.xcconfig"; path = "Pods/Target Support Files/Pods-iTerm2XCTests/Pods-iTerm2XCTests.deployment.xcconfig"; sourceTree = "<group>"; };
AF8B17BA7B3B3CBFD29DA171 /* Pods-iTerm2XCTests.development.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-iTerm2XCTests.development.xcconfig"; path = "Pods/Target Support Files/Pods-iTerm2XCTests/Pods-iTerm2XCTests.development.xcconfig"; sourceTree = "<group>"; };
C6675EBA1C4FE96B0041173B /* iTermSelectorSwizzler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = iTermSelectorSwizzler.h; sourceTree = "<group>"; };
C6675EBB1C4FE96B0041173B /* iTermSelectorSwizzler.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = iTermSelectorSwizzler.m; sourceTree = "<group>"; };
D3CE2D4C1A00936F0098ED99 /* PSMDarkTabStyle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PSMDarkTabStyle.h; sourceTree = "<group>"; };
D3CE2D4D1A00936F0098ED99 /* PSMDarkTabStyle.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PSMDarkTabStyle.m; sourceTree = "<group>"; };
DD02572609CB9398008F320C /* PSMYosemiteTabStyle.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = PSMYosemiteTabStyle.h; sourceTree = "<group>"; };
Loading
Loading
@@ -4177,6 +4180,7 @@
A6C7641D1B45CB2800E3C992 /* iTerm2XCTests */ = {
isa = PBXGroup;
children = (
C6675EB91C4FE95E0041173B /* Utilities */,
A6D22B431BC9D368004084E0 /* iTermShellHistoryTest.m */,
A6BDB0401B45E8BA00F511E6 /* iTermEquivalenceClassSetTest.m */,
A6BDB0471B45EB7F00F511E6 /* iTermIntervalTreeTest.m */,
Loading
Loading
@@ -4241,6 +4245,15 @@
name = Expose;
sourceTree = "<group>";
};
C6675EB91C4FE95E0041173B /* Utilities */ = {
isa = PBXGroup;
children = (
C6675EBA1C4FE96B0041173B /* iTermSelectorSwizzler.h */,
C6675EBB1C4FE96B0041173B /* iTermSelectorSwizzler.m */,
);
name = Utilities;
sourceTree = "<group>";
};
DD02571D09CB9363008F320C /* PSMTabBarControl */ = {
isa = PBXGroup;
children = (
Loading
Loading
@@ -6239,6 +6252,7 @@
A6BDB04C1B45EC3A00F511E6 /* iTermNSStringCategoryTest.m in Sources */,
A6BDB0501B45FBCB00F511E6 /* PTYTextViewTest.m in Sources */,
A667F3871B48615900705186 /* iTermToolbeltTest.m in Sources */,
C6675EBC1C4FE96B0041173B /* iTermSelectorSwizzler.m in Sources */,
A6BDB0461B45EAE700F511E6 /* VT100GridTest.m in Sources */,
A6BDB0441B45E8EE00F511E6 /* VT100ScreenTest.m in Sources */,
A6BDB0B51B45FE7700F511E6 /* iTermSemanticHistoryTest.m in Sources */,
Loading
Loading
Loading
Loading
@@ -9,8 +9,12 @@
#import "PTYTextView.h"
#import "SessionView.h"
#import "VT100LineInfo.h"
#import "iTermPreferences.h"
#import "iTermSelectorSwizzler.h"
#import <objc/runtime.h>
#import <XCTest/XCTest.h>
#import <OCHamcrest/OCHamcrest.h>
#import <OCMockito/OCMockito.h>
 
@interface PTYTextViewTest : XCTestCase
@end
Loading
Loading
@@ -2298,36 +2302,75 @@
 
#pragma mark - Test selection
 
- (void)DISABLED_testSelectedTextVeryBasic {
- (void)testSelectedTextVeryBasic {
// Given
PTYSession *session = [self sessionWithProfileOverrides:@{} size:VT100GridSizeMake(10, 2)];
_textView.dataSource = session.screen;
NSString *text = @"123456789";
[session synchronousReadTask:text];
[_textView selectAll:nil];
NSString *selectedText = [_textView selectedText];
XCTAssertEqualObjects(@"123456789\n\n", selectedText);
NSUserDefaults *mockDefaults = MKTMock([NSUserDefaults class]);
[MKTGiven([mockDefaults objectForKey:kPreferenceKeyCopyLastNewline]) willReturn:@YES];
[MKTGiven([mockDefaults objectForKey:@"TrimWhitespaceOnCopy"]) willReturn:@YES];
[iTermSelectorSwizzler swizzleSelector:@selector(standardUserDefaults)
fromClass:[NSUserDefaults class]
withBlock:^ id { return mockDefaults; }
forBlock:^{
// When
[_textView selectAll:nil];
NSString *selectedText = [_textView selectedText];
// Then
XCTAssertEqualObjects(@"123456789\n\n", selectedText);
}];
}
 
- (void)DISABLED_testSelectedTextWrappedLine {
- (void)testSelectedTextWrappedLine {
// Given
PTYSession *session = [self sessionWithProfileOverrides:@{} size:VT100GridSizeMake(10, 2)];
_textView.dataSource = session.screen;
NSString *text = @"123456789abc";
[session synchronousReadTask:text];
[_textView selectAll:nil];
NSString *selectedText = [_textView selectedText];
XCTAssertEqualObjects([text stringByAppendingString:@"\n"], selectedText);
NSUserDefaults *mockDefaults = MKTMock([NSUserDefaults class]);
[MKTGiven([mockDefaults objectForKey:kPreferenceKeyCopyLastNewline]) willReturn:@YES];
[MKTGiven([mockDefaults objectForKey:@"TrimWhitespaceOnCopy"]) willReturn:@YES];
[iTermSelectorSwizzler swizzleSelector:@selector(standardUserDefaults)
fromClass:[NSUserDefaults class]
withBlock:^ id { return mockDefaults; }
forBlock:^{
// When
[_textView selectAll:nil];
NSString *selectedText = [_textView selectedText];
// Then
XCTAssertEqualObjects([text stringByAppendingString:@"\n"], selectedText);
}];
}
 
- (void)DISABLED_testSelectedTextWrappedAttributedLinesDontGetNewlinesInserted {
- (void)testSelectedTextWrappedAttributedLinesDontGetNewlinesInserted {
// Given
PTYSession *session = [self sessionWithProfileOverrides:@{} size:VT100GridSizeMake(10, 2)];
_textView.dataSource = session.screen;
NSString *text = @"123456789abcdefghi";
[session synchronousReadTask:text];
[_textView selectAll:nil];
NSAttributedString *selectedAttributedText = [_textView selectedTextAttributed:YES
cappedAtSize:0
minimumLineNumber:0];
XCTAssertEqualObjects([text stringByAppendingString:@"\n"], selectedAttributedText.string);
NSUserDefaults *mockDefaults = MKTMock([NSUserDefaults class]);
[MKTGiven([mockDefaults objectForKey:kPreferenceKeyCopyLastNewline]) willReturn:@YES];
[MKTGiven([mockDefaults objectForKey:@"TrimWhitespaceOnCopy"]) willReturn:@YES];
[iTermSelectorSwizzler swizzleSelector:@selector(standardUserDefaults)
fromClass:[NSUserDefaults class]
withBlock:^ id { return mockDefaults; }
forBlock:^{
// When
[_textView selectAll:nil];
NSAttributedString *selectedAttributedText = [_textView selectedTextAttributed:YES
cappedAtSize:0
minimumLineNumber:0];
// Then
XCTAssertEqualObjects([text stringByAppendingString:@"\n"], selectedAttributedText.string);
}];
}
 
- (void)testSelectedTextWithSizeCap {
Loading
Loading
@@ -2340,14 +2383,27 @@
XCTAssertEqualObjects(@"12345", selectedText);
}
 
- (void)DISABLED_testSelectedTextWithMinimumLine {
- (void)testSelectedTextWithMinimumLine {
// Given
PTYSession *session = [self sessionWithProfileOverrides:@{} size:VT100GridSizeMake(10, 2)];
_textView.dataSource = session.screen;
NSString *text = @"blah\r\n12345";
[session synchronousReadTask:text];
[_textView selectAll:nil];
NSString *selectedText = [_textView selectedTextAttributed:NO cappedAtSize:0 minimumLineNumber:1];
XCTAssertEqualObjects(@"12345\n", selectedText);
NSUserDefaults *mockDefaults = MKTMock([NSUserDefaults class]);
[MKTGiven([mockDefaults objectForKey:kPreferenceKeyCopyLastNewline]) willReturn:@YES];
[MKTGiven([mockDefaults objectForKey:@"TrimWhitespaceOnCopy"]) willReturn:@YES];
[iTermSelectorSwizzler swizzleSelector:@selector(standardUserDefaults)
fromClass:[NSUserDefaults class]
withBlock:^ id { return mockDefaults; }
forBlock:^{
// When
[_textView selectAll:nil];
NSString *selectedText = [_textView selectedTextAttributed:NO cappedAtSize:0 minimumLineNumber:1];
// Then
XCTAssertEqualObjects(@"12345\n", selectedText);
}];
}
 
- (void)testSelectedTextWithSizeCapAndMinimumLine {
Loading
Loading
@import Foundation;
/**
* A helper class for swizzling a selector for the scope of a block.
*/
@interface iTermSelectorSwizzler : NSObject
/**
* Swizzles a method with a block for the runtime of a block.
* Lookup order is class method -> instance method.
*
* @param selector The selector to swizzle (must be implemented on the fromClass)
* @param fromClass The class to swizzle the selector
* @param fakeSelectorBlock The block to replace the method implementation in the selector with
* @param block The block to run with the swizzled selector
*/
+ (void)swizzleSelector:(SEL)selector
fromClass:(Class)fromClass
withBlock:(id)fakeSelectorBlock
forBlock:(dispatch_block_t)block;
@end
#import "iTermSelectorSwizzler.h"
#import <objc/runtime.h>
@implementation iTermSelectorSwizzler
+ (void)swizzleSelector:(SEL)selector
fromClass:(Class)fromClass
withBlock:(id)fakeSelectorBlock
forBlock:(dispatch_block_t)block {
if (!fakeSelectorBlock || !block) {
return;
}
Method originalMethod = class_getClassMethod(fromClass, selector)
?: class_getInstanceMethod(fromClass, selector);
IMP originalMethodImplementation = method_getImplementation(originalMethod);
IMP fakeMethodImplementation = imp_implementationWithBlock(fakeSelectorBlock);
method_setImplementation(originalMethod, fakeMethodImplementation);
block();
method_setImplementation(originalMethod, originalMethodImplementation);
}
@end
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment