// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#import "ios/chrome/browser/shared/ui/elements/crossfade_label.h"
#import "base/test/ios/wait_util.h"
#import "ios/chrome/common/ui/colors/semantic_color_names.h"
#import "testing/platform_test.h"
using base::test::ios::WaitUntilConditionOrTimeout;
namespace {
constexpr NSString* kTestText = @"Test Text";
}
class CrossfadeLabelTest : public PlatformTest {
public:
CrossfadeLabelTest() {
_view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 200, 200)];
_label = [[CrossfadeLabel alloc] init];
_label.text = kTestText;
[_view addSubview:_label];
}
protected:
UIView* _view;
CrossfadeLabel* _label;
};
// Tests the crossfade by calling `crossfadeSetup:`, `crossfadeAnimation`, and
// `crossfadeCleanup`, ensuring the color and opacity are correct at each step.
TEST_F(CrossfadeLabelTest, testCrossfade) {
UIColor* black = [UIColor colorNamed:kSolidBlackColor];
UIColor* green = [UIColor colorNamed:kGreenColor];
EXPECT_EQ(_view.subviews.count, 1ul);
_label.textColor = black;
[_label setUpCrossfadeWithTextColor:green attributedText:nil];
EXPECT_EQ(_label.textColor, black);
EXPECT_EQ(_label.alpha, 1);
EXPECT_EQ(_view.subviews.count, 2ul);
__block int steps_completed = 0;
[UIView animateWithDuration:0.01
animations:^{
[_label crossfade];
EXPECT_EQ(_label.textColor, black);
EXPECT_EQ(_label.alpha, 0);
steps_completed++;
}
completion:^(BOOL finished) {
[_label cleanupAfterCrossfade];
EXPECT_EQ(_label.textColor, green);
EXPECT_EQ(_label.alpha, 1);
EXPECT_EQ(_view.subviews.count, 1ul);
steps_completed++;
}];
// Wait for animation to complete.
auto wait_condition = ^{
return steps_completed == 2;
};
bool completed =
WaitUntilConditionOrTimeout(base::Seconds(0.5), wait_condition);
EXPECT_TRUE(completed);
}