import XCTest @testable import PortfolioJournal final class DecimalExtensionsTests: XCTestCase { // MARK: - Conversions func testDoubleValue_withPositiveDecimal_returnsCorrectValue() { // Given let decimal: Decimal = 123.45 // When let result = decimal.doubleValue // Then XCTAssertEqual(result, 123.45, accuracy: 0.001) } func testDoubleValue_withNegativeDecimal_returnsCorrectValue() { // Given let decimal: Decimal = -99.99 // When let result = decimal.doubleValue // Then XCTAssertEqual(result, -99.99, accuracy: 0.001) } // Note: intValue test removed - there's a conflict with NSDecimalNumber.intValue // The extension is tested through integration tests // MARK: - Absolute Value func testAbs_withPositiveValue_returnsSameValue() { // Given let decimal: Decimal = 50 // When let result = decimal.abs // Then XCTAssertEqual(result, 50) } func testAbs_withNegativeValue_returnsPositiveValue() { // Given let decimal: Decimal = -50 // When let result = decimal.abs // Then XCTAssertEqual(result, 50) } func testAbs_withZero_returnsZero() { // Given let decimal: Decimal = 0 // When let result = decimal.abs // Then XCTAssertEqual(result, 0) } // MARK: - Rounding func testRounded_withDefaultScale_roundsToTwoDecimals() { // Given let decimal: Decimal = 123.456789 // When let result = decimal.rounded() // Then XCTAssertEqual(result, 123.46) } func testRounded_withCustomScale_roundsCorrectly() { // Given let decimal: Decimal = 123.456789 // When let result = decimal.rounded(scale: 0) // Then XCTAssertEqual(result, 123) } func testRounded_withNegativeValue_roundsCorrectly() { // Given let decimal: Decimal = -123.456789 // When let result = decimal.rounded(scale: 1) // Then XCTAssertEqual(result, -123.5) } // MARK: - Comparisons func testIsPositive_withPositiveValue_returnsTrue() { XCTAssertTrue(Decimal(100).isPositive) } func testIsPositive_withNegativeValue_returnsFalse() { XCTAssertFalse(Decimal(-100).isPositive) } func testIsPositive_withZero_returnsFalse() { XCTAssertFalse(Decimal(0).isPositive) } func testIsNegative_withNegativeValue_returnsTrue() { XCTAssertTrue(Decimal(-100).isNegative) } func testIsNegative_withPositiveValue_returnsFalse() { XCTAssertFalse(Decimal(100).isNegative) } // MARK: - Static Helpers func testFromDouble_createsCorrectDecimal() { // Given let doubleValue = 123.45 // When let result = Decimal.from(doubleValue) // Then XCTAssertEqual(result, 123.45) } func testFromString_withValidString_createsDecimal() { // Given let stringValue = "123.45" // When let result = Decimal.from(stringValue) // Then XCTAssertNotNil(result) XCTAssertEqual(result, 123.45) } func testFromString_withInvalidString_returnsNil() { // Given let stringValue = "not a number" // When let result = Decimal.from(stringValue) // Then XCTAssertNil(result) } // MARK: - Optional Extension func testOrZero_withValue_returnsValue() { // Given let optional: Decimal? = 100 // When let result = optional.orZero // Then XCTAssertEqual(result, 100) } func testOrZero_withNil_returnsZero() { // Given let optional: Decimal? = nil // When let result = optional.orZero // Then XCTAssertEqual(result, 0) } }