
OCUnit рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдореВрд▓ рдмрд╛рддреЗрдВ, Xcode рдХреЗ рд╕рд╛рде рдПрдХреАрдХреГрдд рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд░реВрдкрд░реЗрдЦрд╛, рдиреАрдЪреЗ рд╡рд░реНрдгрд┐рдд рд╣реИрдВред рд╡рд░реНрдгрд┐рдд рдЪреАрдЬреЛрдВ рдХреЛ рдиреЗрддреНрд░рд╣реАрди рд░реВрдк рд╕реЗ рдЖрдЬрд╝рдорд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдХреЛрдб рддреБрд░рдВрдд
рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЙрдиреНрд╣реЛрдВрдиреЗ Xcode 4 рдХреЗ рдпреБрдЧ рд╕реЗ рдкрд╣рд▓реЗ рд▓рд┐рдЦрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рддрд╕реНрд╡реАрд░реЗрдВ рдереЛрдбрд╝реА рдкреБрд░рд╛рдиреА рд╣реИрдВредрдЗрд╕рд▓рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╢реНрд░реЗрдгреА рд╣реИ рдЬреЛ рдорд╛рдирдХ NSString рд╡рд░реНрдЧ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддреА рд╣реИ рдФрд░ рдЗрд╕рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдлрд╝реНрд▓рд┐рдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝рддреА рд╣реИ:
//ExtendedString.h #import <Cocoa/Cocoa.h> @interface NSString (Extended) - (NSString *)invert; @end
//ExtendedString.m #import "ExtendedString.h" @implementation NSString (Extended) - (NSString *)invert { NSUInteger length = [self length]; NSMutableString *invertedString = [NSMutableString stringWithCapacity: length]; while (length > (NSUInteger)0) { unichar c = [self characterAtIndex:
рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдПрдХ рдирдпрд╛ рд▓рдХреНрд╖реНрдп рдЬреЛрдбрд╝реЗрдВред рдЗрд╕реЗ "рдЯреЗрд╕реНрдЯ" рдХрд╣рд╛ рдЬрд╛рдП:


рд╣рдо рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖ рд░реВрдкрд░реЗрдЦрд╛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ - рд╕реЗрдиреНрдЯрд┐рдВрдЧрдХрд┐рдЯ:

рдЗрд╕реЗ рдХреЗрд╡рд▓ рдЯреЗрд╕реНрдЯ рд▓рдХреНрд╖реНрдп рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:

рд╣рдо рдкрд░реАрдХреНрд╖рдг рдирд╛рдордХ рд╕реНрд░реЛрддреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдореВрд╣ рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдореЗрдВ рдирдИ рдкрд░реАрдХреНрд╖рдг рдлрд╛рдЗрд▓реЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред рд╡реИрд╕реЗ, рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдЯреЗрд╕реНрдЯ рднреМрддрд┐рдХ рд╕рдмрдлрд╝реЛрд▓реНрдбрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИ рдФрд░ рд╕реНрд░реЛрддреЛрдВ рдХреЛ рд╡рд╣рд╛рдВ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд╕рд╛рде рд░рдЦреЗрдВ:


рдЗрд╕реЗ рд╕рдордЭрдиреЗ рдпреЛрдЧреНрдп рддрд░реАрдХреЗ рд╕реЗ рдХреЙрд▓ рдХрд░реЗрдВ - ExtendedString_Test.m - рдФрд░ рдЗрд╕реЗ рдЯреЗрд╕реНрдЯ рд▓рдХреНрд╖реНрдп рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ:

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЯреЗрд╕реНрдЯ рд▓рдХреНрд╖реНрдп рдХреЛ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдП рдЧрдП рд╡рд░реНрдЧ рдХреЗ рд╕реНрд░реЛрдд рдХреЛрдб рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдФрд░ рди рдХреЗрд╡рд▓ рдкрд░реАрдХреНрд╖рдгред рдирддреАрдЬрддрди, рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рд▓рдХреНрд╖реНрдп рд╕рдВрд░рдЪрдирд╛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧреА:

рдпрд╣рд╛рдВ рдкрд░реАрдХреНрд╖рдг рдХреЛрдб рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬреЛ рдЗрд╕реЗ рдЖрд╡рд╢реНрдпрдХ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ:
//ExtendedString_Test.h #import <SenTestingKit/SenTestingKit.h> // // , , // - : //@class MyClass; // Mylass ExtendedString_Test //, NSString @interface ExtendedString_Test : SenTestCase // - { NSString *_string; } @end
//ExtendedString_Test.m #import "ExtendedString_Test.h" #import "ExtendedString.h" // @implementation ExtendedString_Test - (void)setUp // , { _string = [[NSString alloc] initWithString: @"Hello world!"]; STAssertNotNil(_string, @"Construct error!"); // , } - (void)tearDown // , { [_string release]; } - (void)testInvertString // { STAssertEqualObjects(@"Hello world!", _string, @"String is not initialized!"); // STAssertEqualObjects(@"!dlrow olleH", [_string invert], @"String is not inverted!"); // } @end
рдпрджрд┐ рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реИ, рддреЛ рдЯреЗрд╕реНрдЯ рд▓рдХреНрд╖реНрдп рдХреА рдЕрд╕реЗрдВрдмрд▓реА рдмрд╕ рд╕рдлрд▓ рд╣реЛ рдЬрд╛рдПрдЧреАред рдпрджрд┐ рдХреЛрдИ рджрд╛рд╡рд╛ рдЕрдорд╛рдиреНрдп рд╣реИ, рддреЛ рдирд┐рд░реНрдорд╛рдг рдХреЗ рджреМрд░рд╛рди рдПрдХ рддреНрд░реБрдЯрд┐ рджрд┐рдЦрд╛рдИ рдЬрд╛рдПрдЧреА, рдЬреИрд╕реЗ рдХрд┐ рдпрд╣ рдПрдХ рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐ рдереАред рдХреБрдЫ рдЗрд╕ рддрд░рд╣:

рдЕрдм рдпрд╣ рд░рд╕реЛрдИ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИ?
рдЯреЗрд╕реНрдЯ рдЯрд╛рд░рдЧреЗрдЯ рдХреА рдЕрд╕реЗрдВрдмрд▓реА рдХреЗ рджреМрд░рд╛рди, рдПрдХ рд╡рд┐рд╢реЗрд╖ рдмрдВрдбрд▓ рдСрдХреНрдЯреЗрд╕реНрдЯ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рд╕рд╛рде рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдЯрд╛рд░рдЧреЗрдЯ рдХреЛ рдЕрд╕реЗрдореНрдмрд▓ рдХрд░рдиреЗ рдХрд╛ рдЕрдЧрд▓рд╛ рдЪрд░рдг рдирд┐рдореНрди рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд▓рд╛рдирд╛ рд╣реИ:
$ {SYSTEM_DEVELOPER_DIR} / рдЙрдкрдХрд░рдг / RunUnitTests
рдпрд╣ рдЪреАрдЬрд╝, рдмрджрд▓реЗ рдореЗрдВ, рдиреЗрд╕реНрдЯреЗрдб рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд▓рд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рднреА рдХреБрдЫ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдХреЙрд▓рд┐рдВрдЧ / рдбреЗрд╡рд▓рдкрд░ / рдЯреВрд▓реНрд╕ / рдУрдЯреЗрд╕реНрдЯ рдХреЛ рдЙрдмрд╛рд▓рддрд╛ рд╣реИред рдЙрддреНрддрд░рд╛рд░реНрджреНрдз рд╣рдорд╛рд░реЗ рдкрд░реАрдХреНрд╖рдг рдмрдВрдбрд▓ рдХреЛ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рд▓реЛрдб рдХрд░рддрд╛ рд╣реИ, рд╡рд╣рд╛рдВ рд╕реЗрдирдЯреЗрд╕рдХреИрд╕ рд╡рдВрд╢рдЬ рдХрдХреНрд╖рд╛рдПрдВ рдкрд╛рддрд╛ рд╣реИ рдФрд░ рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╕реЗрдЯрдЕрдк рд╡рд┐рдзрд┐ рдХреЛ рдЦреАрдВрдЪрддрд╛ рд╣реИ, рдЕрдВрдд рдореЗрдВ рдЖрдВрд╕реВ рдмрд╣рддрд╛ рд╣реИ, рдФрд░ рдЙрдирдХреЗ рдмреАрдЪ рдпрд╣ рдЙрди рд╕рднреА рддрд░реАрдХреЛрдВ рдХреЛ рдХрд╣рддрд╛ рд╣реИ, рдЬрд┐рдирдХрд╛ рдирд╛рдо "рдкрд░реАрдХреНрд╖рдг" рд╢рдмреНрдж рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред рд╣рд╛рдБ, Objective-C рдЗрд╕реЗ рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ :)
рдЗрд╕рд▓рд┐рдП, рд╕рднреА рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЛ рдЙрдкрд╕рд░реНрдЧ "рдкрд░реАрдХреНрд╖рдг" рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рд╡реИрд╕реЗ, рдСрдХреНрдЯреЗрд╕реНрдЯ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рддрд░рд╣:
export OBJC_DISABLE_GC=YES # Garbage Collector
arch -i386 /Developer/Tools/otest ~/InvertString/build/Debug/Tests.octest # (i386),
рдЖрдЙрдЯрдкреБрдЯ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╣реЛрдЧрд╛:
objc[22721]: GC: forcing GC OFF because OBJC_DISABLE_GC is set
objc[22721]: GC: forcing GC OFF because OBJC_DISABLE_GC is set
Test Suite '/Users/ium/InvertString/build/Debug/Tests.octest(Tests)' started at 2011-07-01 18:46:45 +0300
Test Suite 'ExtendedString_Test' started at 2011-07-01 18:46:45 +0300
/Users/ium/InvertString/Tests/ExtendedString_Test.m:21: error: -[ExtendedString_Test testInvertString] : 'Hello world' should be equal to 'Hello world!' String is not initialized!
2011-07-01 18:46:45.240 otest[22721:80f] !dlrow olleH
/Users/ium/InvertString/Tests/ExtendedString_Test.m:22: error: -[ExtendedString_Test testInvertString] : '!dlrow olle' should be equal to '!dlrow olleH' String is not inverted!
Test Case '-[ExtendedString_Test testInvertString]' failed (0.003 seconds).
Test Suite 'ExtendedString_Test' finished at 2011-07-01 18:46:45 +0300.
Executed 1 test, with 2 failures (0 unexpected) in 0.003 (0.003) seconds
Test Suite '/Users/ium/InvertString/build/Debug/Tests.octest(Tests)' finished at 2011-07-01 18:46:45 +0300.
Executed 1 test, with 2 failures (0 unexpected) in 0.003 (0.010) seconds
рдЦреИрд░, рдпрд╣ рддреНрд░реБрдЯрд┐ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд▓рд┐рдП рд╣реИ, рдмрд┐рд▓реНрдХреБрд▓ред рдпрд╣ рд╕рдм рд▓реЙрдЧ рдореЗрдВ рдкрдбрд╝рддрд╛ рд╣реИ, рд╡реИрд╕реЗ (рдмрд┐рд▓реНрдб> рдмрд┐рд▓реНрдб рдкрд░рд┐рдгрд╛рдо)ред
рдЕрд╕реЗрдВрдмрд▓реА рдХреЗ рджреМрд░рд╛рди sdterr рдкрд░ рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, Xcode рдЗрд╕реЗ рддреБрд░рдВрдд рдкрд╛рд░реНрд╕ рдХрд░рддрд╛ рд╣реИ, рдХреАрд╡рд░реНрдб "рддреНрд░реБрдЯрд┐:" рдХреЛ рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рдФрд░ рд▓рд╛рдЗрди рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рдЦреЛрдЬрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХреА рддрд╕реНрд╡реАрд░ рдореЗрдВ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЦреВрдмрд╕реВрд░рддреА рд╕реЗ рдЙрдЬрд╛рдЧрд░ рдХрд░рддрд╛ рд╣реИред
рджрд╛рд╡реЛрдВ рдХреЛ рдорд╛рдиреНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдХреНрд░реЛрдЬрд╝ рдХрд╛ рд╕реЗрдЯ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИ:
STFail(description, ...) // , , STAssertNil(a1, description, ...) STAssertNotNil(a1, description, ...) STAssertTrue(expression, description, ...) STAssertFalse(expression, description, ...) STAssertEqualObjects(a1, a2, description, ...) // , STAssertEquals(a1, a2, description, ...) // STAssertEqualsWithAccuracy(left, right, accuracy, description, ...) STAssertThrows(expression, description, ...) STAssertThrowsSpecific(expression, specificException, description, ...) STAssertThrowsSpecificNamed(expr, specificException, aName, description, ...) STAssertNoThrow(expression, description, ...) STAssertNoThrowSpecific(expression, specificException, description, ...) STAssertNoThrowSpecificNamed(expr, specificException, aName, description, ...) STAssertTrueNoThrow(expression, description, ...) STAssertFalseNoThrow(expression, description, ...)
рдирд╛рдо рдЦреБрдж рдХреЗ рд▓рд┐рдП рдмреЛрд▓рддреЗ рд╣реИрдВ, рд╕рд┐рд╡рд╛рдп рдЙрди рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗред рджреАрд░реНрдШрд╡реГрддреНрдд рд╡рд┐рд╡рд░рдг рдкреНрд░рд╛рд░реВрдк рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рдкреИрд░рд╛рдореАрдЯрд░ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд╡рд╣рд╛рдБ, рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рдПрдХ рдкреНрд░рддрд┐рд╢рдд рд╕рдВрдХреЗрддред
рдЕрдкрдиреЗ рдЬреНрдЮрд╛рди рдХреЛ рдЧрд╣рд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ
рджрд╕реНрддрд╛рд╡реЗрдЬ рдФрд░
рдЗрд╕реЗ рдкрдврд╝рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВред
рд╕реМрднрд╛рдЧреНрдп рд╣реИ