From fa7a280f0e6e0bbf5f694de81eeeabb9db24c348 Mon Sep 17 00:00:00 2001 From: Wojciech Nagrodzki <278594+wnagrodzki@users.noreply.github.com> Date: Thu, 3 Jun 2021 20:08:38 +0200 Subject: [PATCH] Suppress setting the same value on object --- .../UserInterfaceVariations/UIVariation.swift | 19 ++++++++++++---- .../UIVariationTests.swift | 22 +++++++++++++++++++ 2 files changed, 37 insertions(+), 4 deletions(-) diff --git a/Sources/UserInterfaceVariations/UIVariation.swift b/Sources/UserInterfaceVariations/UIVariation.swift index b5050d0..fbc3e3a 100644 --- a/Sources/UserInterfaceVariations/UIVariation.swift +++ b/Sources/UserInterfaceVariations/UIVariation.swift @@ -63,17 +63,28 @@ public class UIVariation: NSObject { extension UIVariation: UIVariationApplying { func applyIfMatchesTraitEnvironment() { + guard doesMatchTraitEnvironment() else { return } + object[keyPath: property] = value + } + + func applyIfMatchesTraitEnvironment() where Value: Equatable { + guard doesMatchTraitEnvironment() else { return } + guard object[keyPath: property] != value else { return } + object[keyPath: property] = value + } + + private func doesMatchTraitEnvironment() -> Bool { guard let traitCollection = traitEnvironment?.traitCollection else { print("Missing traitEnvironment when trying to apply \(self)") - return + return false } if let horizontalSizeClass = horizontalSizeClass { - if traitCollection.horizontalSizeClass != horizontalSizeClass { return } + if traitCollection.horizontalSizeClass != horizontalSizeClass { return false } } if let verticalSizeClass = verticalSizeClass { - if traitCollection.verticalSizeClass != verticalSizeClass { return } + if traitCollection.verticalSizeClass != verticalSizeClass { return false } } - object[keyPath: property] = value + return true } } diff --git a/Tests/UserInterfaceVariationsTests/UIVariationTests.swift b/Tests/UserInterfaceVariationsTests/UIVariationTests.swift index c4bcd2d..4061d20 100644 --- a/Tests/UserInterfaceVariationsTests/UIVariationTests.swift +++ b/Tests/UserInterfaceVariationsTests/UIVariationTests.swift @@ -85,6 +85,20 @@ final class UIVariationTests: XCTestCase { XCTAssertNotEqual(label.text, sut.value) } + func test_When_object_value_is_already_equal_to_variation_value_Then_variation_is_NOT_applied() { + let object = Object() + let sut = UIVariation(object: object, + keyPath: \.text, + value: valueWhenCompact, + horizontalSizeClass: .compact, + verticalSizeClass: nil) + traitEnvironment.traitCollection = UITraitCollection(horizontalSizeClass: .compact) + sut.traitEnvironment = traitEnvironment + sut.applyIfMatchesTraitEnvironment() + sut.applyIfMatchesTraitEnvironment() + XCTAssertEqual(object.setCount, 1) + } + func test_factory_method_for_sizeClassDimension_horizontal() { let variations = UIVariation.make(for: label, property: \.text, @@ -134,3 +148,11 @@ class TraitEnvironmentStub: NSObject, UITraitEnvironment { } } + +class Object { + + var text: String? { + didSet { setCount += 1 } + } + var setCount = 0 +}