Skip to content

Commit

Permalink
NSString: Fix -commonPrefixWithString:options: behaviour (#455)
Browse files Browse the repository at this point in the history
* Update changelog

* NSString: fix -commonPrefixWithString:options: behaviour

* NSString: More test cases
  • Loading branch information
hmelder authored Oct 28, 2024
1 parent 8b65241 commit cf4c985
Show file tree
Hide file tree
Showing 4 changed files with 53 additions and 0 deletions.
6 changes: 6 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
2024-10-28 Hugo Melder <[email protected]>
* Source/NSString.m:
-commonPrefixWithString:options: returns nil when string supplied as
first argument is nil. On macOS, the empty string is returned instead.
Align implementation with macOS.

2024-10-13 Richard Frith-Macdonald <[email protected]>

* Source/NSFileManager.m: Create an NSError object when we fail to
Expand Down
5 changes: 5 additions & 0 deletions Source/NSString.m
Original file line number Diff line number Diff line change
Expand Up @@ -3227,6 +3227,11 @@ - (NSUInteger) hash
- (NSString*) commonPrefixWithString: (NSString*)aString
options: (NSUInteger)mask
{
// Return empty string to match behaviour on macOS
if (nil == aString)
{
return @"";
}
if (mask & NSLiteralSearch)
{
int prefix_len = 0;
Expand Down
3 changes: 3 additions & 0 deletions Tests/base/NSString/basic.m
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,9 @@ int main()
PASS([@"" isEqual: nil] == NO, "an empty string is not null");
PASS([@"" isEqualToString: nil] == NO, "an empty string is not null");

s = [@"test" commonPrefixWithString: nil options: 0];
PASS_EQUAL(s, @"", "Common prefix of some string with nil is empty string");

[arp release]; arp = nil;
return 0;
}
39 changes: 39 additions & 0 deletions Tests/base/NSString/common_prefix.m
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
#import <Foundation/NSAutoreleasePool.h>
#import <Foundation/NSString.h>
#import "Testing.h"

int main()
{
NSAutoreleasePool *arp = [NSAutoreleasePool new];
NSString *result;

result = [@"abc" commonPrefixWithString:nil options:0];
PASS_EQUAL(result, @"", "common prefix of some string with nil is empty string");

result = [@"abc" commonPrefixWithString:@"abc" options:0];
PASS_EQUAL(result, @"abc", "common prefix of identical strings is the entire string");

result = [@"abc" commonPrefixWithString:@"abx" options:0];
PASS_EQUAL(result, @"ab", "common prefix of 'abc' and 'abx' is 'ab'");

result = [@"abc" commonPrefixWithString:@"def" options:0];
PASS_EQUAL(result, @"", "common prefix of completely different strings is empty");

result = [@"abc" commonPrefixWithString:@"" options:0];
PASS_EQUAL(result, @"", "common prefix with an empty string is empty");

result = [@"abc" commonPrefixWithString:@"a" options:0];
PASS_EQUAL(result, @"a", "common prefix of 'abc' and 'a' is 'a'");

result = [@"abc" commonPrefixWithString:@"aöç" options:0];
PASS_EQUAL(result, @"a", "common prefix of 'abc' and 'aöç' is 'a'");

result = [@"" commonPrefixWithString:@"abc" options:0];
PASS_EQUAL(result, @"", "common prefix with an empty base string is empty");

result = [@"abc" commonPrefixWithString:@"abcx" options:0];
PASS_EQUAL(result, @"abc", "common prefix of 'abc' and 'abcx' is 'abc'");

[arp drain];
}

0 comments on commit cf4c985

Please sign in to comment.