From ffb11707607ebd5eae365d08556f7c1006f1d31f Mon Sep 17 00:00:00 2001 From: Javier Cicchelli Date: Sat, 6 May 2023 21:19:40 +0000 Subject: [PATCH] [Enhancement] Optional+Nil extension (#17) This PR contains the work done to add some properties to the `Optional` primitives. In addition, some work has been done to improve some existing codebase as well. Co-authored-by: Javier Cicchelli Reviewed-on: https://repo.rock-n-code.com/rock-n-code/swift-libs/pulls/17 --- Sources/Core/Extensions/Optional+Nil.swift | 23 +++++++ Sources/Core/Extensions/String+Empty.swift | 15 ++--- Sources/Core/Extensions/TimeZone+Zone.swift | 2 +- .../Cases/Extensions/Optional+NilTests.swift | 66 +++++++++++++++++++ .../Cases/Extensions/String+EmptyTests.swift | 4 +- .../Cases/Extensions/TimeZone+ZoneTests.swift | 34 ++++++++++ 6 files changed, 132 insertions(+), 12 deletions(-) create mode 100644 Sources/Core/Extensions/Optional+Nil.swift create mode 100644 Tests/Core/Cases/Extensions/Optional+NilTests.swift create mode 100644 Tests/Core/Cases/Extensions/TimeZone+ZoneTests.swift diff --git a/Sources/Core/Extensions/Optional+Nil.swift b/Sources/Core/Extensions/Optional+Nil.swift new file mode 100644 index 0000000..b7f345b --- /dev/null +++ b/Sources/Core/Extensions/Optional+Nil.swift @@ -0,0 +1,23 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the SwiftLibs open source project +// +// Copyright (c) 2023 Röck+Cöde VoF. and the SwiftLibs project authors +// Licensed under the EUPL 1.2 or later. +// +// See LICENSE.txt for license information +// See CONTRIBUTORS.txt for the list of SwiftLibs project authors +// +//===----------------------------------------------------------------------===// + +public extension Optional { + + // MARK: Properties + + /// A Boolean value indicating whether an optional has not been set. + var isNil: Bool { self == nil } + + /// A Boolean value indicating whether an optional has been set. + var isNotNil: Bool { !isNil } + +} diff --git a/Sources/Core/Extensions/String+Empty.swift b/Sources/Core/Extensions/String+Empty.swift index b3a599a..12636f2 100644 --- a/Sources/Core/Extensions/String+Empty.swift +++ b/Sources/Core/Extensions/String+Empty.swift @@ -12,17 +12,14 @@ public extension String { - // MARK: Properties + // MARK: Constants - /// Represents an empty string. + /// A string that represents an empty string. static let empty = "" - // MARK: Functions - - /// Checks whether a string is not empty. - /// - Returns: A boolean value that represents whether the string is not empty. - func isNotEmpty() -> Bool { - isEmpty == false - } + // MARK: Properties + + /// A Boolean value indicating whether a string is not empty. + var isNotEmpty: Bool { !isEmpty } } diff --git a/Sources/Core/Extensions/TimeZone+Zone.swift b/Sources/Core/Extensions/TimeZone+Zone.swift index e7a524b..c9152c7 100644 --- a/Sources/Core/Extensions/TimeZone+Zone.swift +++ b/Sources/Core/Extensions/TimeZone+Zone.swift @@ -4,7 +4,7 @@ public extension TimeZone { // MARK: Zones - /// Greenwich Mean Time or UTC+0 + /// A time zone indicating it is Greenwich Mean Time or UTC+0 static let gmt = TimeZone(secondsFromGMT: 0) } diff --git a/Tests/Core/Cases/Extensions/Optional+NilTests.swift b/Tests/Core/Cases/Extensions/Optional+NilTests.swift new file mode 100644 index 0000000..5a9bcc1 --- /dev/null +++ b/Tests/Core/Cases/Extensions/Optional+NilTests.swift @@ -0,0 +1,66 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the SwiftLibs open source project +// +// Copyright (c) 2023 Röck+Cöde VoF. and the SwiftLibs project authors +// Licensed under the EUPL 1.2 or later. +// +// See LICENSE.txt for license information +// See CONTRIBUTORS.txt for the list of SwiftLibs project authors +// +//===----------------------------------------------------------------------===// + +import Core +import XCTest + +final class Optional_NilTests: XCTestCase { + + // MARK: Properties + + private var optional: Int? + + private var result: Bool! + + // MARK: Tests + + func test_isNil_whenOptionalHasNotBeenSet() { + // GIVEN + // WHEN + result = optional.isNil + + // THEN + XCTAssertTrue(result) + } + + func test_isNil_whenOptionalHasBeenSet() { + // GIVEN + optional = 0 + + // WHEN + result = optional.isNil + + // THEN + XCTAssertFalse(result) + } + + func test_isNotNil_whenOptionalHasNotBeenSet() { + // GIVEN + // WHEN + result = optional.isNotNil + + // THEN + XCTAssertFalse(result) + } + + func test_isNotNil_whenOptionalHasBeenSet() { + // GIVEN + optional = 0 + + // WHEN + result = optional.isNotNil + + // THEN + XCTAssertTrue(result) + } + +} diff --git a/Tests/Core/Cases/Extensions/String+EmptyTests.swift b/Tests/Core/Cases/Extensions/String+EmptyTests.swift index 956abf0..23a204f 100644 --- a/Tests/Core/Cases/Extensions/String+EmptyTests.swift +++ b/Tests/Core/Cases/Extensions/String+EmptyTests.swift @@ -31,7 +31,7 @@ final class String_EmptyTests: XCTestCase { let string = String.empty // WHEN - let result = string.isNotEmpty() + let result = string.isNotEmpty // THEN XCTAssertFalse(result) @@ -42,7 +42,7 @@ final class String_EmptyTests: XCTestCase { let string = String.Test.string // WHEN - let result = string.isNotEmpty() + let result = string.isNotEmpty // THEN XCTAssertTrue(result) diff --git a/Tests/Core/Cases/Extensions/TimeZone+ZoneTests.swift b/Tests/Core/Cases/Extensions/TimeZone+ZoneTests.swift new file mode 100644 index 0000000..0bfcd34 --- /dev/null +++ b/Tests/Core/Cases/Extensions/TimeZone+ZoneTests.swift @@ -0,0 +1,34 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the SwiftLibs open source project +// +// Copyright (c) 2023 Röck+Cöde VoF. and the SwiftLibs project authors +// Licensed under the EUPL 1.2 or later. +// +// See LICENSE.txt for license information +// See CONTRIBUTORS.txt for the list of SwiftLibs project authors +// +//===----------------------------------------------------------------------===// + +import Core +import XCTest + +final class TimeZone_ZoneTests: XCTestCase { + + // MARK: Properties + + private var timeZone: TimeZone! + + // MARK: Tests + + func test_gmt() { + // GIVEN + // WHEN + timeZone = .gmt + + // THEN + XCTAssertEqual(timeZone.identifier, "GMT") + XCTAssertEqual(timeZone.secondsFromGMT(), 0) + } + +}