diff --git a/Sources/ChouTiUI/Universal/Shape/AdvancedShapes/PathBlockShape.swift b/Sources/ChouTiUI/Universal/Shape/AdvancedShapes/PathBlockShape.swift new file mode 100644 index 0000000..8df79ee --- /dev/null +++ b/Sources/ChouTiUI/Universal/Shape/AdvancedShapes/PathBlockShape.swift @@ -0,0 +1,53 @@ +// +// PathBlockShape.swift +// ChouTiUI +// +// Created by Honghao Zhang on 7/12/22. +// Copyright © 2020 Honghao Zhang. +// +// MIT License +// +// Copyright (c) 2020 Honghao Zhang (github.com/honghaoz) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to +// deal in the Software without restriction, including without limitation the +// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +// sell copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +// IN THE SOFTWARE. +// + +import CoreGraphics + +import ChouTi + +/// A shape backed by a block that returns a shape path. +public struct PathBlockShape: Shape { + + private let shapePathBlock: HashableBox CGPath> + + /// Creates a shape from shape path block. + /// + /// - Parameters: + /// - shapePathBlock: The shape path block, passed in the bounding rect. `HashableBox` is used to determine the block identity. + public init(_ shapePathBlock: HashableBox CGPath>) { + self.shapePathBlock = shapePathBlock + } + + // MARK: - Shape + + public func path(in rect: CGRect) -> CGPath { + shapePathBlock.value(rect) + } +} diff --git a/Tests/ChouTiUITests/Universal/Shape/AdvancedShapes/PathBlockShapeTests.swift b/Tests/ChouTiUITests/Universal/Shape/AdvancedShapes/PathBlockShapeTests.swift new file mode 100644 index 0000000..bd8983a --- /dev/null +++ b/Tests/ChouTiUITests/Universal/Shape/AdvancedShapes/PathBlockShapeTests.swift @@ -0,0 +1,65 @@ +// +// PathBlockShapeTests.swift +// ChouTiUI +// +// Created by Honghao Zhang on 9/23/24. +// Copyright © 2020 Honghao Zhang. +// +// MIT License +// +// Copyright (c) 2020 Honghao Zhang (github.com/honghaoz) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to +// deal in the Software without restriction, including without limitation the +// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +// sell copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +// IN THE SOFTWARE. +// + +import CoreGraphics + +import ChouTiTest + +import ChouTiUI + +final class PathBlockShapeTests: XCTestCase { + + func test_path() { + let shape = PathBlockShape(.key("100") { rect in + CGPath(rect: rect, transform: nil) + }) + + expect(shape.path(in: CGRect(0, 0, 100, 100))) == CGPath(rect: CGRect(0, 0, 100, 100), transform: nil) + } + + func test_equal() { + let shape1 = PathBlockShape(.key("100") { rect in + CGPath(rect: rect, transform: nil) + }) + let shape2 = PathBlockShape(.key("100") { rect in + CGPath(rect: rect, transform: nil) + }) + let shape3 = PathBlockShape(.key("200") { rect in + CGPath(rect: rect, transform: nil) + }) + let shape4 = PathBlockShape(.key(123) { rect in + CGPath(rect: rect, transform: nil) + }) + + expect(shape1) == shape2 + expect(shape1) != shape3 + expect(shape1) != shape4 + } +}