|
| 1 | +// Copyright (c) 2022 Feng Yang |
| 2 | +// |
| 3 | +// I am making my contributions/submissions to this project solely in my |
| 4 | +// personal capacity and am not conveying any rights to any intellectual |
| 5 | +// property of any third parties. |
| 6 | + |
| 7 | +import XCTest |
| 8 | +@testable import Math |
| 9 | + |
| 10 | +class BoundingBoxTests: XCTestCase { |
| 11 | + override func setUpWithError() throws { |
| 12 | + // Put setup code here. This method is called before the invocation of each test method in the class. |
| 13 | + } |
| 14 | + |
| 15 | + override func tearDownWithError() throws { |
| 16 | + // Put teardown code here. This method is called after the invocation of each test method in the class. |
| 17 | + } |
| 18 | + |
| 19 | + func testConstructor() { |
| 20 | + // Create a same box by different param. |
| 21 | + let box1 = BoundingBox.fromCenterAndExtent(center: Vector3(0, 0, 0), extent: Vector3(1, 1, 1)) |
| 22 | + |
| 23 | + let points = [ |
| 24 | + Vector3(0, 0, 0), |
| 25 | + Vector3(-1, 0, 0), |
| 26 | + Vector3(1, 0, 0), |
| 27 | + Vector3(0, 1, 0), |
| 28 | + Vector3(0, 1, 1), |
| 29 | + Vector3(1, 0, 1), |
| 30 | + Vector3(0, 0.5, 0.5), |
| 31 | + Vector3(0, -0.5, 0.5), |
| 32 | + Vector3(0, -1, 0.5), |
| 33 | + Vector3(0, 0, -1) |
| 34 | + ] |
| 35 | + let box2 = BoundingBox.fromPoints(points: points) |
| 36 | + |
| 37 | + let sphere = BoundingSphere(Vector3(0, 0, 0), 1) |
| 38 | + let box3 = BoundingBox.fromSphere(sphere: sphere) |
| 39 | + |
| 40 | + let min1 = box1.min |
| 41 | + let max1 = box1.max |
| 42 | + |
| 43 | + let min2 = box2.min |
| 44 | + let max2 = box2.max |
| 45 | + |
| 46 | + let min3 = box3.min |
| 47 | + let max3 = box3.max |
| 48 | + |
| 49 | + XCTAssertEqual(Vector3.equals(left: min1, right: min2), true) |
| 50 | + XCTAssertEqual(Vector3.equals(left: max1, right: max2), true) |
| 51 | + XCTAssertEqual(Vector3.equals(left: min1, right: min3), true) |
| 52 | + XCTAssertEqual(Vector3.equals(left: max1, right: max3), true) |
| 53 | + XCTAssertEqual(Vector3.equals(left: min2, right: min3), true) |
| 54 | + XCTAssertEqual(Vector3.equals(left: max2, right: max3), true) |
| 55 | + } |
| 56 | + |
| 57 | + func testTransform() { |
| 58 | + var box = BoundingBox(Vector3(-1, -1, -1), Vector3(1, 1, 1)) |
| 59 | + let matrix = Matrix(m11: 2, m12: 0, m13: 0, m14: 0, |
| 60 | + m21: 0, m22: 2, m23: 0, m24: 0, |
| 61 | + m31: 0, m32: 0, m33: 2, m34: 0, |
| 62 | + m41: 1, m42: 0.5, m43: -1, m44: 1) |
| 63 | + let newBox = BoundingBox.transform(source: box, matrix: matrix) |
| 64 | + _ = box.transform(matrix: matrix) |
| 65 | + |
| 66 | + let newMin = Vector3(-1, -1.5, -3) |
| 67 | + let newMax = Vector3(3, 2.5, 1) |
| 68 | + XCTAssertEqual(Vector3.equals(left: newBox.min, right: newMin), true) |
| 69 | + XCTAssertEqual(Vector3.equals(left: newBox.max, right: newMax), true) |
| 70 | + XCTAssertEqual(Vector3.equals(left: box.min, right: newMin), true) |
| 71 | + XCTAssertEqual(Vector3.equals(left: box.max, right: newMax), true) |
| 72 | + } |
| 73 | + |
| 74 | + func testMerge() { |
| 75 | + let box1 = BoundingBox(Vector3(-1, -1, -1), Vector3(2, 2, 2)) |
| 76 | + let box2 = BoundingBox(Vector3(-2, -0.5, -2), Vector3(3, 0, 3)) |
| 77 | + let box = BoundingBox.merge(box1: box1, box2: box2) |
| 78 | + XCTAssertEqual(Vector3.equals(left: Vector3(-2, -1, -2), right: box.min), true) |
| 79 | + XCTAssertEqual(Vector3.equals(left: Vector3(3, 2, 3), right: box.max), true) |
| 80 | + } |
| 81 | + |
| 82 | + func testGetCenter() { |
| 83 | + let box = BoundingBox(Vector3(-1, -1, -1), Vector3(3, 3, 3)) |
| 84 | + let center = box.getCenter() |
| 85 | + XCTAssertEqual(Vector3.equals(left: Vector3(1, 1, 1), right: center), true) |
| 86 | + } |
| 87 | + |
| 88 | + func testGetExtent() { |
| 89 | + let box = BoundingBox(Vector3(-1, -1, -1), Vector3(3, 3, 3)) |
| 90 | + let extent = box.getExtent() |
| 91 | + XCTAssertEqual(Vector3.equals(left: Vector3(2, 2, 2), right: extent), true) |
| 92 | + } |
| 93 | + |
| 94 | + func testGetCorners() { |
| 95 | + let min = Vector3(-1, -1, -1) |
| 96 | + let max = Vector3(3, 3, 3) |
| 97 | + let minX = min.x |
| 98 | + let minY = min.y |
| 99 | + let minZ = min.z |
| 100 | + let maxX = max.x |
| 101 | + let maxY = max.y |
| 102 | + let maxZ = max.z |
| 103 | + var expectedCorners = [ |
| 104 | + Vector3(), |
| 105 | + Vector3(), |
| 106 | + Vector3(), |
| 107 | + Vector3(), |
| 108 | + Vector3(), |
| 109 | + Vector3(), |
| 110 | + Vector3(), |
| 111 | + Vector3() |
| 112 | + ] |
| 113 | + _ = expectedCorners[0].set(x: minX, y: maxY, z: maxZ) |
| 114 | + _ = expectedCorners[1].set(x: maxX, y: maxY, z: maxZ) |
| 115 | + _ = expectedCorners[2].set(x: maxX, y: minY, z: maxZ) |
| 116 | + _ = expectedCorners[3].set(x: minX, y: minY, z: maxZ) |
| 117 | + _ = expectedCorners[4].set(x: minX, y: maxY, z: minZ) |
| 118 | + _ = expectedCorners[5].set(x: maxX, y: maxY, z: minZ) |
| 119 | + _ = expectedCorners[6].set(x: maxX, y: minY, z: minZ) |
| 120 | + _ = expectedCorners[7].set(x: minX, y: minY, z: minZ) |
| 121 | + |
| 122 | + let box = BoundingBox(min, max) |
| 123 | + let corners = box.getCorners() |
| 124 | + for i in 0..<8 { |
| 125 | + XCTAssertEqual(Vector3.equals(left: corners[i], right: expectedCorners[i]), true) |
| 126 | + } |
| 127 | + } |
| 128 | + |
| 129 | + func testClone() { |
| 130 | + let a = BoundingBox(Vector3(0, 0, 0), Vector3(1, 1, 1)) |
| 131 | + let b = a |
| 132 | + XCTAssertEqual(Vector3.equals(left: a.min, right: b.min), true) |
| 133 | + XCTAssertEqual(Vector3.equals(left: a.max, right: b.max), true) |
| 134 | + } |
| 135 | + |
| 136 | + func testCloneTo() { |
| 137 | + let a = BoundingBox(Vector3(0, 0, 0), Vector3(1, 1, 1)) |
| 138 | + let out = a |
| 139 | + XCTAssertEqual(Vector3.equals(left: a.min, right: out.min), true) |
| 140 | + XCTAssertEqual(Vector3.equals(left: a.max, right: out.max), true) |
| 141 | + } |
| 142 | +} |
0 commit comments