diff --git a/Example/Example.xcodeproj/project.pbxproj b/Example/Example.xcodeproj/project.pbxproj index 492df85..c836f11 100644 --- a/Example/Example.xcodeproj/project.pbxproj +++ b/Example/Example.xcodeproj/project.pbxproj @@ -24,6 +24,7 @@ DCA9838727D6A44700D6EA30 /* NavigationBarExampleViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCA9838627D6A44700D6EA30 /* NavigationBarExampleViewController.swift */; }; DCA9838927D6A55A00D6EA30 /* NavigationBarExample.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = DCA9838827D6A55A00D6EA30 /* NavigationBarExample.storyboard */; }; DCA9838B27D6A74800D6EA30 /* SwiftUIExampleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCA9838A27D6A74800D6EA30 /* SwiftUIExampleView.swift */; }; + F560001227EA2032001913A0 /* GradientLoadingBarView+ViewModelTestCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = F560001127EA2032001913A0 /* GradientLoadingBarView+ViewModelTestCase.swift */; }; F57C83C927DA11580025AA11 /* GradientLoadingBarViewTestCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = F57C83C827DA11580025AA11 /* GradientLoadingBarViewTestCase.swift */; }; F5F5B69C27D94B1800D998B5 /* GradientActivityIndicatorView+AnimateIsHiddenTestCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = F5F5B69727D94B1800D998B5 /* GradientActivityIndicatorView+AnimateIsHiddenTestCase.swift */; }; F5F5B69D27D94B1800D998B5 /* GradientLoadingBarViewModelTestCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = F5F5B69927D94B1800D998B5 /* GradientLoadingBarViewModelTestCase.swift */; }; @@ -77,6 +78,7 @@ DCA9838627D6A44700D6EA30 /* NavigationBarExampleViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationBarExampleViewController.swift; sourceTree = ""; }; DCA9838827D6A55A00D6EA30 /* NavigationBarExample.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = NavigationBarExample.storyboard; sourceTree = ""; }; DCA9838A27D6A74800D6EA30 /* SwiftUIExampleView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SwiftUIExampleView.swift; sourceTree = ""; }; + F560001127EA2032001913A0 /* GradientLoadingBarView+ViewModelTestCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "GradientLoadingBarView+ViewModelTestCase.swift"; sourceTree = ""; }; F57C83C827DA11580025AA11 /* GradientLoadingBarViewTestCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GradientLoadingBarViewTestCase.swift; sourceTree = ""; }; F5F5B69727D94B1800D998B5 /* GradientActivityIndicatorView+AnimateIsHiddenTestCase.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "GradientActivityIndicatorView+AnimateIsHiddenTestCase.swift"; sourceTree = ""; }; F5F5B69927D94B1800D998B5 /* GradientLoadingBarViewModelTestCase.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GradientLoadingBarViewModelTestCase.swift; sourceTree = ""; }; @@ -268,8 +270,9 @@ F5F5B69827D94B1800D998B5 /* ViewModel */ = { isa = PBXGroup; children = ( - F5F5B69927D94B1800D998B5 /* GradientLoadingBarViewModelTestCase.swift */, F5F5B69A27D94B1800D998B5 /* GradientActivityIndicatorViewModelTestCase.swift */, + F560001127EA2032001913A0 /* GradientLoadingBarView+ViewModelTestCase.swift */, + F5F5B69927D94B1800D998B5 /* GradientLoadingBarViewModelTestCase.swift */, F5F5B69B27D94B1800D998B5 /* NotchGradientLoadingBarViewModelTestCase.swift */, ); path = ViewModel; @@ -607,6 +610,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + F560001227EA2032001913A0 /* GradientLoadingBarView+ViewModelTestCase.swift in Sources */, F5F5B69E27D94B1800D998B5 /* GradientActivityIndicatorViewModelTestCase.swift in Sources */, F5F5B69C27D94B1800D998B5 /* GradientActivityIndicatorView+AnimateIsHiddenTestCase.swift in Sources */, F5F5B69F27D94B1800D998B5 /* NotchGradientLoadingBarViewModelTestCase.swift in Sources */, diff --git a/Example/ExampleTests/ViewModel/GradientLoadingBarView+ViewModelTestCase.swift b/Example/ExampleTests/ViewModel/GradientLoadingBarView+ViewModelTestCase.swift new file mode 100644 index 0000000..2140e31 --- /dev/null +++ b/Example/ExampleTests/ViewModel/GradientLoadingBarView+ViewModelTestCase.swift @@ -0,0 +1,81 @@ +// +// GradientLoadingBarView+ViewModelTestCase.swift +// ExampleTests +// +// Created by Felix Mau on 22.03.22. +// Copyright © 2022 Felix Mau. All rights reserved. +// + +import XCTest +import SwiftUI + +@testable import GradientLoadingBar + +// swiftlint:disable:next type_name +final class GradientLoadingBarView_ViewModelTestCase: XCTestCase { + // MARK: - Test property `gradientColors` + + func test_initialGradientColors_shouldIncludeReversedGradientColors() { + // Given + let gradientColors: [Color] = [.red, .yellow, .green] + + // When + let viewModel = GradientLoadingBarView.ViewModel(gradientColors: gradientColors, progressDuration: 1) + + // Then + let expectedGradientColors: [Color] = [.red, .yellow, .green, .yellow, .red, .yellow, .green] + XCTAssertEqual(viewModel.gradientColors, expectedGradientColors) + } + + // MARK: - Test property `offset` + + func test_initialOffset_shouldBeZero() { + // When + let viewModel = GradientLoadingBarView.ViewModel(gradientColors: [], progressDuration: 1) + + // Then + XCTAssertEqual(viewModel.offset, 0) + } + + func test_settingSize_shouldUpdateOffset() { + // Given + let viewModel = GradientLoadingBarView.ViewModel(gradientColors: [], progressDuration: 1) + let size = CGSize(width: .random(in: 1 ... 100_000), height: .random(in: 1 ... 100_000)) + + var receivedValues = [CGFloat]() + let subscription = viewModel.$offset.sink { + receivedValues.append($0) + } + + withExtendedLifetime(subscription) { + // When + viewModel.size = size + } + + // Then + let expectedValues = [0, -size.width, size.width] + XCTAssertEqual(receivedValues, expectedValues) + } + + // MARK: - Test property `gradientWidth` + + func test_initialGradientWidth_shouldBeZero() { + // When + let viewModel = GradientLoadingBarView.ViewModel(gradientColors: [], progressDuration: 1) + + // Then + XCTAssertEqual(viewModel.gradientWidth, 0) + } + + func test_settingSize_shouldUpdateGradientWidth() { + // Given + let viewModel = GradientLoadingBarView.ViewModel(gradientColors: [], progressDuration: 1) + let size = CGSize(width: .random(in: 1 ... 100_000), height: .random(in: 1 ... 100_000)) + + // When + viewModel.size = size + + // Then + XCTAssertEqual(viewModel.gradientWidth, size.width * 3) + } +}