react-native-macos/RNTester/RNTesterUnitTests/RCTConvert_UIColorTests.m

201 строка
6.9 KiB
Objective-C

/*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
#import <XCTest/XCTest.h>
#import <React/RCTConvert.h>
@interface RCTConvert_NSColorTests : XCTestCase
@end
static BOOL CGColorsAreEqual(CGColorRef color1, CGColorRef color2) {
CGFloat rgba1[4];
CGFloat rgba2[4];
RCTGetRGBAColorComponents(color1, rgba1);
RCTGetRGBAColorComponents(color2, rgba2);
for (int i = 0; i < 4; i++) {
if (rgba1[i] != rgba2[i]) {
return NO;
}
}
return YES;
}
@implementation RCTConvert_NSColorTests
- (void)testColor
{
id json = RCTJSONParse(@"{ \"semantic\": \"lightTextColor\" }", nil);
UIColor *value = [RCTConvert UIColor:json];
XCTAssertEqualObjects(value, [UIColor lightTextColor]);
}
- (void)testColorFailure
{
id json = RCTJSONParse(@"{ \"semantic\": \"bogusColor\" }", nil);
__block NSString *errorMessage = nil;
RCTLogFunction defaultLogFunction = RCTGetLogFunction();
RCTSetLogFunction(^(__unused RCTLogLevel level, __unused RCTLogSource source, __unused NSString *fileName, __unused NSNumber *lineNumber, NSString *message) {
errorMessage = message;
});
UIColor *value = [RCTConvert UIColor:json];
RCTSetLogFunction(defaultLogFunction);
XCTAssertEqualObjects(value, nil);
XCTAssertTrue([errorMessage containsString:@"labelColor"]); // the RedBox message will contain a list of the valid color names.
}
- (void)testFallbackColor
{
id json = RCTJSONParse(@"{ \"semantic\": \"unitTestFallbackColorIOS\" }", nil);
UIColor *value = [RCTConvert UIColor:json];
XCTAssertTrue(CGColorsAreEqual([value CGColor], [[UIColor blueColor] CGColor]));
}
- (void)testDynamicColor
{
// 0 == 0x00000000 == black
// 16777215 == 0x00FFFFFF == white
id json = RCTJSONParse(@"{ \"dynamic\": { \"light\":0, \"dark\":16777215 } }", nil);
UIColor *value = [RCTConvert UIColor:json];
XCTAssertNotNil(value);
#if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED >= 130000
if (@available(iOS 13.0, *)) {
id savedTraitCollection = [UITraitCollection currentTraitCollection];
[UITraitCollection setCurrentTraitCollection:[UITraitCollection traitCollectionWithUserInterfaceStyle:UIUserInterfaceStyleLight]];
CGFloat rgba[4];
RCTGetRGBAColorComponents([value CGColor], rgba);
XCTAssertEqual(rgba[0], 0);
XCTAssertEqual(rgba[1], 0);
XCTAssertEqual(rgba[2], 0);
XCTAssertEqual(rgba[3], 0);
[UITraitCollection setCurrentTraitCollection:[UITraitCollection traitCollectionWithUserInterfaceStyle:UIUserInterfaceStyleDark]];
RCTGetRGBAColorComponents([value CGColor], rgba);
XCTAssertEqual(rgba[0], 1);
XCTAssertEqual(rgba[1], 1);
XCTAssertEqual(rgba[2], 1);
XCTAssertEqual(rgba[3], 0);
[UITraitCollection setCurrentTraitCollection:savedTraitCollection];
}
#endif
}
- (void)testCompositeDynamicColor
{
id json = RCTJSONParse(@"{ \"dynamic\": { \"light\": { \"semantic\": \"systemRedColor\" }, \"dark\":{ \"semantic\": \"systemBlueColor\" } } }", nil);
UIColor *value = [RCTConvert UIColor:json];
XCTAssertNotNil(value);
#if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED >= 130000
if (@available(iOS 13.0, *)) {
id savedTraitCollection = [UITraitCollection currentTraitCollection];
[UITraitCollection setCurrentTraitCollection:[UITraitCollection traitCollectionWithUserInterfaceStyle:UIUserInterfaceStyleLight]];
XCTAssertTrue(CGColorsAreEqual([value CGColor], [[UIColor systemRedColor] CGColor]));
[UITraitCollection setCurrentTraitCollection:[UITraitCollection traitCollectionWithUserInterfaceStyle:UIUserInterfaceStyleDark]];
XCTAssertTrue(CGColorsAreEqual([value CGColor], [[UIColor systemBlueColor] CGColor]));
[UITraitCollection setCurrentTraitCollection:savedTraitCollection];
}
#endif
}
- (void)testGenerateFallbacks
{
NSDictionary<NSString *, NSNumber*>* semanticColors = @{
// https://developer.apple.com/documentation/uikit/uicolor/ui_element_colors
// Label Colors
@"labelColor": @(0xFF000000),
@"secondaryLabelColor": @(0x993c3c43),
@"tertiaryLabelColor": @(0x4c3c3c43),
@"quaternaryLabelColor": @(0x2d3c3c43),
// Fill Colors
@"systemFillColor": @(0x33787880),
@"secondarySystemFillColor": @(0x28787880),
@"tertiarySystemFillColor": @(0x1e767680),
@"quaternarySystemFillColor": @(0x14747480),
// Text Colors
@"placeholderTextColor": @(0x4c3c3c43),
// Standard Content Background Colors
@"systemBackgroundColor": @(0xFFffffff),
@"secondarySystemBackgroundColor": @(0xFFf2f2f7),
@"tertiarySystemBackgroundColor": @(0xFFffffff),
// Grouped Content Background Colors
@"systemGroupedBackgroundColor": @(0xFFf2f2f7),
@"secondarySystemGroupedBackgroundColor": @(0xFFffffff),
@"tertiarySystemGroupedBackgroundColor": @(0xFFf2f2f7),
// Separator Colors
@"separatorColor": @(0x493c3c43),
@"opaqueSeparatorColor": @(0xFFc6c6c8),
// Link Color
@"linkColor": @(0xFF007aff),
// https://developer.apple.com/documentation/uikit/uicolor/standard_colors
// Adaptable Colors
@"systemBrownColor": @(0xFFa2845e),
@"systemIndigoColor": @(0xFF5856d6),
// Adaptable Gray Colors
@"systemGray2Color": @(0xFFaeaeb2),
@"systemGray3Color": @(0xFFc7c7cc),
@"systemGray4Color": @(0xFFd1d1d6),
@"systemGray5Color": @(0xFFe5e5ea),
@"systemGray6Color": @(0xFFf2f2f7),
};
#if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED >= 130000
id savedTraitCollection = nil;
if (@available(iOS 13.0, *)) {
savedTraitCollection = [UITraitCollection currentTraitCollection];
[UITraitCollection setCurrentTraitCollection:[UITraitCollection traitCollectionWithUserInterfaceStyle:UIUserInterfaceStyleLight]];
}
#endif
for (NSString *semanticColor in semanticColors) {
id json = RCTJSONParse([NSString stringWithFormat:@"{ \"semantic\": \"%@\" }", semanticColor], nil);
UIColor *value = [RCTConvert UIColor:json];
XCTAssertNotNil(value);
NSNumber *fallback = [semanticColors objectForKey:semanticColor];
NSUInteger rgbValue = [fallback unsignedIntegerValue];
NSUInteger alpha1 = ((rgbValue & 0xFF000000) >> 24);
NSUInteger red1 = ((rgbValue & 0x00FF0000) >> 16);
NSUInteger green1 = ((rgbValue & 0x0000FF00) >> 8);
NSUInteger blue1 = ((rgbValue & 0x000000FF) >> 0);
CGFloat rgba[4];
RCTGetRGBAColorComponents([value CGColor], rgba);
NSUInteger red2 = rgba[0] * 255;
NSUInteger green2 = rgba[1] * 255;
NSUInteger blue2 = rgba[2] * 255;
NSUInteger alpha2 = rgba[3] * 255;
XCTAssertEqual(red1, red2);
XCTAssertEqual(green1, green2);
XCTAssertEqual(blue1, blue2);
XCTAssertEqual(alpha1, alpha2);
}
#if defined(__IPHONE_OS_VERSION_MAX_ALLOWED) && __IPHONE_OS_VERSION_MAX_ALLOWED >= 130000
if (@available(iOS 13.0, *)) {
[UITraitCollection setCurrentTraitCollection:savedTraitCollection];
}
#endif
}
@end