Skip to content

Commit

Permalink
Refactor Armstrong number functions to support Int128 and update test…
Browse files Browse the repository at this point in the history
… cases
  • Loading branch information
meatball133 committed Dec 17, 2024
1 parent 98b42de commit 5f659a4
Show file tree
Hide file tree
Showing 6 changed files with 79 additions and 69 deletions.
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import Foundation

func isArmstrongNumber(_ number: Int) -> Bool {
func isArmstrongNumber(_ number: Int128) -> Bool {
let stringNumber = String(number)
let numberLength = stringNumber.count
let sum = stringNumber.compactMap { Int(String($0)) }.reduce(0) { $0 + Int(pow(Double($1), Double(numberLength))) }
Expand Down
36 changes: 19 additions & 17 deletions exercises/practice/armstrong-numbers/.meta/template.swift
Original file line number Diff line number Diff line change
@@ -1,20 +1,22 @@
import XCTest
import Testing
import Foundation
@testable import {{exercise|camelCase}}
class {{exercise|camelCase}}Tests: XCTestCase {
let runAll = Bool(ProcessInfo.processInfo.environment["RUNALL", default: "false"]) ?? false

{% for case in cases %}
{% if forloop.first -%}
func test{{case.description |camelCase }}() {
{% else -%}
func test{{case.description |camelCase }}() throws {
try XCTSkipIf(true && !runAll) // change true to false to run this test
{% endif -%}
{%- if case.expected -%}
XCTAssertTrue(isArmstrongNumber({{case.input.number}}))
{%- else -%}
XCTAssertFalse(isArmstrongNumber({{case.input.number}}))
{%- endif %}
}
{% endfor -%}
let RUNALL = Bool(ProcessInfo.processInfo.environment["RUNALL", default: "false"]) ?? false

{% for case in cases %}
{% if forloop.first -%}
@Test("{{case.description}}")
func test{{case.description |camelCase }}() {
{% else -%}
@Test("{{case.description}}", .enabled(if: RUNALL))
func test{{case.description |camelCase }}() throws {
{% endif -%}
{%- if case.expected -%}
#expect(isArmstrongNumber({{case.input.number}}))
{%- else -%}
#expect(isArmstrongNumber({{case.input.number}}))
{%- endif %}
}
{% endfor -%}

2 changes: 0 additions & 2 deletions exercises/practice/armstrong-numbers/.meta/tests.toml
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,6 @@ description = "Seven-digit number that is not an Armstrong number"

[5ee2fdf8-334e-4a46-bb8d-e5c19c02c148]
description = "Armstrong number containing seven zeroes"
include = false

[12ffbf10-307a-434e-b4ad-c925680e1dd4]
description = "The largest and last Armstrong number"
include = false
2 changes: 1 addition & 1 deletion exercises/practice/armstrong-numbers/Package.swift
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// swift-tools-version:5.3
// swift-tools-version:6.0

import PackageDescription

Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
func isArmstrongNumber(_ number: Int) -> Bool {
func isArmstrongNumber(_ number: Int128) -> Bool {
// Write your code for the 'Armstrong Numbers' exercise here.
}
Original file line number Diff line number Diff line change
@@ -1,51 +1,61 @@
import XCTest
import Testing
import Foundation

@testable import ArmstrongNumbers

class ArmstrongNumbersTests: XCTestCase {
let runAll = Bool(ProcessInfo.processInfo.environment["RUNALL", default: "false"]) ?? false

func testZeroIsAnArmstrongNumber() {
XCTAssertTrue(isArmstrongNumber(0))
}

func testSingleDigitNumbersAreArmstrongNumbers() throws {
try XCTSkipIf(true && !runAll) // change true to false to run this test
XCTAssertTrue(isArmstrongNumber(5))
}

func testThereAreNoTwoDigitArmstrongNumbers() throws {
try XCTSkipIf(true && !runAll) // change true to false to run this test
XCTAssertFalse(isArmstrongNumber(10))
}

func testThreeDigitNumberThatIsAnArmstrongNumber() throws {
try XCTSkipIf(true && !runAll) // change true to false to run this test
XCTAssertTrue(isArmstrongNumber(153))
}

func testThreeDigitNumberThatIsNotAnArmstrongNumber() throws {
try XCTSkipIf(true && !runAll) // change true to false to run this test
XCTAssertFalse(isArmstrongNumber(100))
}

func testFourDigitNumberThatIsAnArmstrongNumber() throws {
try XCTSkipIf(true && !runAll) // change true to false to run this test
XCTAssertTrue(isArmstrongNumber(9474))
}

func testFourDigitNumberThatIsNotAnArmstrongNumber() throws {
try XCTSkipIf(true && !runAll) // change true to false to run this test
XCTAssertFalse(isArmstrongNumber(9475))
}

func testSevenDigitNumberThatIsAnArmstrongNumber() throws {
try XCTSkipIf(true && !runAll) // change true to false to run this test
XCTAssertTrue(isArmstrongNumber(9_926_315))
}

func testSevenDigitNumberThatIsNotAnArmstrongNumber() throws {
try XCTSkipIf(true && !runAll) // change true to false to run this test
XCTAssertFalse(isArmstrongNumber(9_926_314))
}
let RUNALL = Bool(ProcessInfo.processInfo.environment["RUNALL", default: "false"]) ?? false

@Test("Zero is an Armstrong number")
func testZeroIsAnArmstrongNumber() {
#expect(isArmstrongNumber(0))
}

@Test("Single-digit numbers are Armstrong numbers", .enabled(if: RUNALL))
func testSingleDigitNumbersAreArmstrongNumbers() throws {
#expect(isArmstrongNumber(5))
}

@Test("There are no two-digit Armstrong numbers", .enabled(if: RUNALL))
func testThereAreNoTwoDigitArmstrongNumbers() throws {
#expect(isArmstrongNumber(10))
}

@Test("Three-digit number that is an Armstrong number", .enabled(if: RUNALL))
func testThreeDigitNumberThatIsAnArmstrongNumber() throws {
#expect(isArmstrongNumber(153))
}

@Test("Three-digit number that is not an Armstrong number", .enabled(if: RUNALL))
func testThreeDigitNumberThatIsNotAnArmstrongNumber() throws {
#expect(isArmstrongNumber(100))
}

@Test("Four-digit number that is an Armstrong number", .enabled(if: RUNALL))
func testFourDigitNumberThatIsAnArmstrongNumber() throws {
#expect(isArmstrongNumber(9474))
}

@Test("Four-digit number that is not an Armstrong number", .enabled(if: RUNALL))
func testFourDigitNumberThatIsNotAnArmstrongNumber() throws {
#expect(isArmstrongNumber(9475))
}

@Test("Seven-digit number that is an Armstrong number", .enabled(if: RUNALL))
func testSevenDigitNumberThatIsAnArmstrongNumber() throws {
#expect(isArmstrongNumber(9_926_315))
}

@Test("Seven-digit number that is not an Armstrong number", .enabled(if: RUNALL))
func testSevenDigitNumberThatIsNotAnArmstrongNumber() throws {
#expect(isArmstrongNumber(9_926_314))
}

@Test("Armstrong number containing seven zeroes", .enabled(if: RUNALL))
func testArmstrongNumberContainingSevenZeroes() throws {
#expect(isArmstrongNumber(186_709_961_001_538_790_100_634_132_976_990))
}

@Test("The largest and last Armstrong number", .enabled(if: RUNALL))
func testTheLargestAndLastArmstrongNumber() throws {
#expect(isArmstrongNumber(115_132_219_018_763_992_565_095_597_973_971_522_401))
}

0 comments on commit 5f659a4

Please sign in to comment.