- moved componentsSeparatedByCharactersInSet: into CPCharacterSetAdditions CPString category

- added tests for componentsSeparatedByCharactersInSet:
- ensured Cocoa compatibility of componentsSeparatedByCharactersInSet:
- added new test for CPString boolValue
- fixed CPString boolValue (" ++01" should return NO as in Cocoa, previously it returned YES)
This commit is contained in:
Arkadiusz Młynarczyk
2010-09-10 18:58:18 -04:00
committed by Alexander Ljungberg
parent 009683ddd4
commit ddfac8d717
3 changed files with 78 additions and 47 deletions
+37
View File
@@ -322,6 +322,43 @@ _CPCharacterSetTrimAtEnd = 1 << 2;
@implementation CPString (CPCharacterSetAdditions)
/*!
Tokenizes the receiver string using the charactes
in a given set. For example, if the receiver is:
\c "Baku baku to jest skład."
and the set is [CPCharacterSet whitespaceCharacterSet]
the returned array would contain:
<pre> ["Baku", "baku", "to", "jest", "", "skład."] </pre>
Adjacent occurences of the separator characters produce empty strings in the result.
@author Arkadiusz Młynarczyk <arek@tupux.com>
@param A character set containing the characters to use to split the receiver. Must not be nil.
@return An CPArray object containing substrings from the receiver that have been divided by characters in separator.
*/
- (CPArray)componentsSeparatedByCharactersInSet:(CPCharacterSet)separator
{
if (!separator)
[CPException raise:CPInvalidArgumentException
reason:"componentsSeparatedByCharactersInSet: the separator can't be 'nil'"];
var components = [CPMutableArray array];
var componentRange = CPMakeRange(0, 0);
for (var i=0; i < self.length; i++)
{
if ([separator characterIsMember:self.charAt(i)])
{
componentRange.length = i - componentRange.location;
[components addObject:[self substringWithRange:componentRange]];
componentRange.location += componentRange.length + 1;
}
}
componentRange.length = self.length - componentRange.location;
[components addObject:[self substringWithRange:componentRange]];
return components;
}
// As per the Cocoa method.
- (id)stringByTrimmingCharactersInSet:(CPCharacterSet)set
{
+1 -46
View File
@@ -268,50 +268,6 @@ var CPStringRegexSpecialCharacters = [
return split(aString);
}
/*!
Tokenizes the receiver string using the charactes
in a given set. For example, if the receiver is:
\c "Baku baku to jest skład."
and the set is [CPCharacterSet whitespaceCharacterSet]
the returned array would contain:
<pre> ["Baku", "baku", "to", "jest", "", "skład."] </pre>
Adjacent occurences of the separator characters produce empty strings in the result.
@author Arkadiusz Młynarczyk <arek@tupux.com>
@param A character set containing the characters to use to split the receiver. Must not be nil.
@return An CPArray object containing substrings from the receiver that have been divided by characters in separator.
*/
/*
TODO Write some tests for cases with [CPCharacterSet whitespaceCharacterSet]
"Baku baku to jest skład." ["Baku", "baku", "to", "jest", "", "skład."]
"Abradab" - ["Abradab"]
"" - [""]
" Test " - check what is returned by NSString here, probably ["", "Test"];
*/
- (CPArray)componentsSeparatedByCharactersInSet:(CPCharacterSet)separator {
if (!separator)
[CPException raise:CPInvalidArgumentException
reason:"componentsSeparatedByCharactersInSet: the separator can't be 'nil'"];
CPMutableArray components = [CPMutableArray array];
CPRange componentRange = CPMakeRange(0, 0);
if (self.length) {
for (var i=0; i < self.length; i++) {
if ([separator characterIsMember:self.charAt(i)]) {
componentRange.length = i - componentRange.location;
[components addObject:[self substringWithRange:componentRange]];
componentRange.location += componentRange.length + 1;
}
}
if (componentRange.location < self.length ) {
componentRange.length = self.length - componentRange.location;
[components addObject:[self substringWithRange:componentRange]];
}
} else {
[components addObject:[NSString stringWithString:self]];
}
return components;
}
/*!
Returns a substring starting from the specified index to the end of the receiver.
@param anIndex the starting string (inclusive)
@@ -689,10 +645,9 @@ var CPStringRegexSpecialCharacters = [
a digit 1-9. Returns \c NO otherwise. This method skips the initial
whitespace characters, +,- followed by Zeroes.
*/
- (BOOL)boolValue
{
var replaceRegExp = new RegExp("^\\s*[\\+,\\-]*0*");
var replaceRegExp = new RegExp("^\\s*[\\+,\\-]?0*");
return RegExp("^[Y,y,t,T,1-9]").test(self.replace(replaceRegExp, ''));
}
+40 -1
View File
@@ -1,4 +1,5 @@
@import <Foundation/CPString.j>
@import <Foundation/CPCharacterSet.j>
@implementation CPStringTest : OJTestCase
@@ -144,7 +145,8 @@
[" NO", NO],
[" -N00", NO],
[" 00", NO],
[" -00", NO]
[" -00", NO],
[" -+001", NO],
];
for (var i = 0; i < testStrings.length; i++)
@@ -312,4 +314,41 @@
[self assertFalse:["abc" hasSuffix:""]];
}
- (void)testComponentsSeparatedByCharactersInSetEmptyString
{
[self assert:[""]
equals:["" componentsSeparatedByCharactersInSet:[CPCharacterSet whitespaceCharacterSet]]];
}
- (void)testComponentsSeparatedByCharactersInSetStringWithoutCharactersFromSet
{
[self assert:["Abradab"]
equals:["Abradab" componentsSeparatedByCharactersInSet:[CPCharacterSet whitespaceCharacterSet]]];
}
- (void)testComponentsSeparatedByCharactersInSet
{
[self assert:["Baku", "baku", "to", "jest", "", "skład."]
equals:["Baku baku to jest skład." componentsSeparatedByCharactersInSet:[CPCharacterSet whitespaceCharacterSet]]];
}
- (void)testComponentsSeparatedByCharactersInSetLeadingAndTrailingCharacterFromSet
{
[self assert:["", "Test", ""]
equals:[" Test " componentsSeparatedByCharactersInSet:[CPCharacterSet whitespaceCharacterSet]]];
}
- (void)testComponentsSeparatedByCharactersExceptionRaiseOnNilSeparator
{
try
{
[[CPString string] componentsSeparatedByCharactersInSet:nil];
[self assert:false];
}
catch (anException)
{
[self assert:[anException name] equals:CPInvalidArgumentException];
[self assert:[anException reason] equals:@"componentsSeparatedByCharactersInSet: the separator can't be 'nil'"];
}
}
@end