diff --git a/MVMCore/MVMCore/ActionHandling/ActionBackModel.swift b/MVMCore/MVMCore/ActionHandling/ActionBackModel.swift index fea8eea..2ec606c 100644 --- a/MVMCore/MVMCore/ActionHandling/ActionBackModel.swift +++ b/MVMCore/MVMCore/ActionHandling/ActionBackModel.swift @@ -25,4 +25,12 @@ public struct ActionBackModel: ActionModelProtocol { self.extraParameters = extraParameters self.analyticsData = analyticsData } + + // Default + public func isEqual(to model: any ModelComparisonProtocol) -> Bool { + guard let model = model as? Self else { return false } + return model.actionType == actionType + && model.extraParameters == extraParameters + && model.analyticsData == analyticsData + } } diff --git a/MVMCore/MVMCore/ActionHandling/ActionCallModel.swift b/MVMCore/MVMCore/ActionHandling/ActionCallModel.swift index dc6a32e..78c02f1 100644 --- a/MVMCore/MVMCore/ActionHandling/ActionCallModel.swift +++ b/MVMCore/MVMCore/ActionHandling/ActionCallModel.swift @@ -28,4 +28,11 @@ public struct ActionCallModel: ActionModelProtocol { self.extraParameters = extraParameters self.analyticsData = analyticsData } + + public func isEqual(to model: any ModelComparisonProtocol) -> Bool { + guard let model = model as? Self else { return false } + return extraParameters == model.extraParameters + && analyticsData == model.analyticsData + && callNumber == model.callNumber + } } diff --git a/MVMCore/MVMCore/ActionHandling/ActionCancelModel.swift b/MVMCore/MVMCore/ActionHandling/ActionCancelModel.swift index 83ae013..b1a7c37 100644 --- a/MVMCore/MVMCore/ActionHandling/ActionCancelModel.swift +++ b/MVMCore/MVMCore/ActionHandling/ActionCancelModel.swift @@ -25,4 +25,12 @@ public struct ActionCancelModel: ActionModelProtocol { self.extraParameters = extraParameters self.analyticsData = analyticsData } + + // Default + public func isEqual(to model: any ModelComparisonProtocol) -> Bool { + guard let model = model as? Self else { return false } + return model.actionType == actionType + && model.extraParameters == extraParameters + && model.analyticsData == analyticsData + } } diff --git a/MVMCore/MVMCore/ActionHandling/ActionContactModel.swift b/MVMCore/MVMCore/ActionHandling/ActionContactModel.swift index 9b975fc..12e918b 100644 --- a/MVMCore/MVMCore/ActionHandling/ActionContactModel.swift +++ b/MVMCore/MVMCore/ActionHandling/ActionContactModel.swift @@ -42,4 +42,14 @@ public struct ActionContactModel: ActionModelProtocol { self.extraParameters = extraParameters self.analyticsData = analyticsData } + + public func isEqual(to model: any ModelComparisonProtocol) -> Bool { + guard let model = model as? Self else { return false } + return extraParameters == model.extraParameters + && analyticsData == model.analyticsData + && phoneNumber == model.phoneNumber + && firstName == model.firstName + && lastName == model.lastName + && approach == model.approach + } } diff --git a/MVMCore/MVMCore/ActionHandling/ActionNoopModel.swift b/MVMCore/MVMCore/ActionHandling/ActionNoopModel.swift index 941e80a..c0c075d 100644 --- a/MVMCore/MVMCore/ActionHandling/ActionNoopModel.swift +++ b/MVMCore/MVMCore/ActionHandling/ActionNoopModel.swift @@ -7,6 +7,7 @@ // public struct ActionNoopModel: ActionModelProtocol { + //-------------------------------------------------- // MARK: - Properties //-------------------------------------------------- @@ -24,4 +25,12 @@ public struct ActionNoopModel: ActionModelProtocol { self.extraParameters = extraParameters self.analyticsData = analyticsData } + + // Default + public func isEqual(to model: any ModelComparisonProtocol) -> Bool { + guard let model = model as? Self else { return false } + return model.actionType == actionType + && model.extraParameters == extraParameters + && model.analyticsData == analyticsData + } } diff --git a/MVMCore/MVMCore/ActionHandling/ActionOpenSMSModel.swift b/MVMCore/MVMCore/ActionHandling/ActionOpenSMSModel.swift index 88f709d..372c942 100644 --- a/MVMCore/MVMCore/ActionHandling/ActionOpenSMSModel.swift +++ b/MVMCore/MVMCore/ActionHandling/ActionOpenSMSModel.swift @@ -30,4 +30,13 @@ public struct ActionOpenSMSModel: ActionModelProtocol { self.extraParameters = extraParameters self.analyticsData = analyticsData } + + // Default + public func isEqual(to model: any ModelComparisonProtocol) -> Bool { + guard let model = model as? Self else { return false } + return model.extraParameters == extraParameters + && model.analyticsData == analyticsData + && model.phoneNumber == phoneNumber + && model.message == message + } } diff --git a/MVMCore/MVMCore/ActionHandling/ActionOpenUrlModel.swift b/MVMCore/MVMCore/ActionHandling/ActionOpenUrlModel.swift index c9f6f8a..57daae8 100644 --- a/MVMCore/MVMCore/ActionHandling/ActionOpenUrlModel.swift +++ b/MVMCore/MVMCore/ActionHandling/ActionOpenUrlModel.swift @@ -60,4 +60,13 @@ open class ActionOpenUrlModel: ActionModelProtocol { try container.encodeIfPresent(extraParameters, forKey: .extraParameters) try container.encodeIfPresent(analyticsData, forKey: .analyticsData) } + + public func isEqual(to model: any ModelComparisonProtocol) -> Bool { + guard let model = model as? Self else { return false } + return extraParameters == model.extraParameters + && analyticsData == model.analyticsData + && browserUrl == model.browserUrl + && appURL == model.appURL + && appURLOptions == model.appURLOptions + } } diff --git a/MVMCore/MVMCore/ActionHandling/ActionPreviousSubmitModel.swift b/MVMCore/MVMCore/ActionHandling/ActionPreviousSubmitModel.swift index 31290dc..489aaf7 100644 --- a/MVMCore/MVMCore/ActionHandling/ActionPreviousSubmitModel.swift +++ b/MVMCore/MVMCore/ActionHandling/ActionPreviousSubmitModel.swift @@ -25,4 +25,12 @@ public struct ActionPreviousSubmitModel: ActionModelProtocol { self.extraParameters = extraParameters self.analyticsData = analyticsData } + + // Default + public func isEqual(to model: any ModelComparisonProtocol) -> Bool { + guard let model = model as? Self else { return false } + return model.actionType == actionType + && model.extraParameters == extraParameters + && model.analyticsData == analyticsData + } } diff --git a/MVMCore/MVMCore/ActionHandling/ActionRestartModel.swift b/MVMCore/MVMCore/ActionHandling/ActionRestartModel.swift index e64a6d3..635c541 100644 --- a/MVMCore/MVMCore/ActionHandling/ActionRestartModel.swift +++ b/MVMCore/MVMCore/ActionHandling/ActionRestartModel.swift @@ -32,4 +32,11 @@ public struct ActionRestartModel: ActionModelProtocol { self.extraParameters = extraParameters self.analyticsData = analyticsData } + + public func isEqual(to model: any ModelComparisonProtocol) -> Bool { + guard let model = model as? Self else { return false } + return extraParameters == model.extraParameters + && analyticsData == model.analyticsData + && requestURL == model.requestURL + } } diff --git a/MVMCore/MVMCore/ActionHandling/ActionSettingModel.swift b/MVMCore/MVMCore/ActionHandling/ActionSettingModel.swift index b2fd687..0a87349 100644 --- a/MVMCore/MVMCore/ActionHandling/ActionSettingModel.swift +++ b/MVMCore/MVMCore/ActionHandling/ActionSettingModel.swift @@ -25,4 +25,10 @@ public struct ActionSettingModel: ActionModelProtocol { self.extraParameters = extraParameters self.analyticsData = analyticsData } + + public func isEqual(to model: any ModelComparisonProtocol) -> Bool { + guard let model = model as? Self else { return false } + return extraParameters == model.extraParameters + && analyticsData == model.analyticsData + } } diff --git a/MVMCore/MVMCore/ActionHandling/ActionShareModel.swift b/MVMCore/MVMCore/ActionHandling/ActionShareModel.swift index ddeb7d8..813dd92 100644 --- a/MVMCore/MVMCore/ActionHandling/ActionShareModel.swift +++ b/MVMCore/MVMCore/ActionHandling/ActionShareModel.swift @@ -6,7 +6,7 @@ // Copyright © 2020 myverizon. All rights reserved. // -public struct ActionShareItemModel: Codable { +public struct ActionShareItemModel: Codable, Equatable { public enum SharedType: String, Codable { case text @@ -14,14 +14,14 @@ public struct ActionShareItemModel: Codable { } public var type: SharedType - public var value: Any + public var value: AnyHashable // Common Equatable type between String and URL. private enum CodingKeys: String, CodingKey { case type case value } - public init(type: SharedType, value: Any) { + public init(type: SharedType, value: AnyHashable) { self.type = type self.value = value } @@ -47,6 +47,11 @@ public struct ActionShareItemModel: Codable { try container.encode(value as! URL, forKey: .value) } } + + public static func == (lhs: ActionShareItemModel, rhs: ActionShareItemModel) -> Bool { + return lhs.type == rhs.type + && lhs.value == rhs.value + } } public struct ActionShareModel: ActionModelProtocol { @@ -101,7 +106,7 @@ public struct ActionShareModel: ActionModelProtocol { private init(deprecatedFrom decoder: Decoder) throws { let typeContainer = try decoder.container(keyedBy: DeprecatedCodingKeys.self) let type = try typeContainer.decode(ActionShareItemModel.SharedType.self, forKey: .sharedType) - var value: Any + var value: AnyHashable switch type { case .url: value = try typeContainer.decode(URL.self, forKey: .sharedText) @@ -116,4 +121,11 @@ public struct ActionShareModel: ActionModelProtocol { try container.encode(actionType, forKey: .actionType) try container.encode(items, forKey: .items) } + + public func isEqual(to model: any ModelComparisonProtocol) -> Bool { + guard let model = model as? Self else { return false } + return extraParameters == model.extraParameters + && analyticsData == model.analyticsData + && items == model.items + } } diff --git a/MVMCore/MVMCore/ActionHandling/OpenURLOptionsModel.swift b/MVMCore/MVMCore/ActionHandling/OpenURLOptionsModel.swift index 09911c8..ec4e08a 100644 --- a/MVMCore/MVMCore/ActionHandling/OpenURLOptionsModel.swift +++ b/MVMCore/MVMCore/ActionHandling/OpenURLOptionsModel.swift @@ -9,7 +9,8 @@ import Foundation /// A model for UIApplication.OpenExternalURLOptionsKey -open class OpenUrlOptionsModel: Codable { +open class OpenUrlOptionsModel: Codable, Equatable { + public var options: [UIApplication.OpenExternalURLOptionsKey: Any] //-------------------------------------------------- @@ -42,4 +43,16 @@ open class OpenUrlOptionsModel: Codable { try container.encode(universalLinksValue, forKey: .universalLinksOnly) } } + + public static func == (lhs: OpenUrlOptionsModel, rhs: OpenUrlOptionsModel) -> Bool { + return lhs.options.allSatisfy { pair in + switch(pair.key) { + case .universalLinksOnly: + return rhs.options[pair.key] as? Bool == pair.value as? Bool + default: + return true + } + } + } + } diff --git a/MVMCore/MVMCore/Models/ActionType/ActionModelProtocol.swift b/MVMCore/MVMCore/Models/ActionType/ActionModelProtocol.swift index d6cb1c7..3ff3173 100644 --- a/MVMCore/MVMCore/Models/ActionType/ActionModelProtocol.swift +++ b/MVMCore/MVMCore/Models/ActionType/ActionModelProtocol.swift @@ -38,7 +38,7 @@ public extension ActionModelProtocol { return actionType } - func isEqual(to model: any ModelProtocol) -> Bool { + func isEqual(to model: any ModelComparisonProtocol) -> Bool { guard let model = model as? Self else { return false } return model.actionType == actionType && model.extraParameters == extraParameters diff --git a/MVMCore/MVMCore/Models/ActionType/ActionRunJavaScriptModel.swift b/MVMCore/MVMCore/Models/ActionType/ActionRunJavaScriptModel.swift index d457793..f14ffa2 100644 --- a/MVMCore/MVMCore/Models/ActionType/ActionRunJavaScriptModel.swift +++ b/MVMCore/MVMCore/Models/ActionType/ActionRunJavaScriptModel.swift @@ -29,4 +29,11 @@ public class ActionRunJavaScriptModel: ActionModelProtocol { self.extraParameters = extraParameters self.analyticsData = analyticsData } + + public func isEqual(to model: any ModelComparisonProtocol) -> Bool { + guard let model = model as? Self else { return false } + return jsCallback == model.jsCallback + && extraParameters == model.extraParameters + && analyticsData == model.analyticsData + } }