Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions Cosmos/CosmosAccessibility.swift
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ struct CosmosAccessibility {
increment = ceil(rating) - rating
if increment == 0 { increment = 1 }

case .half, .precise:
case .half, .precise, .quarter:
increment = (ceil(rating * 2) - rating * 2) / 2
if increment == 0 { increment = 0.5 }
}
Expand All @@ -87,7 +87,7 @@ struct CosmosAccessibility {
increment = rating - floor(rating)
if increment == 0 { increment = 1 }

case .half, .precise:
case .half, .precise, .quarter:
increment = (rating * 2 - floor(rating * 2)) / 2
if increment == 0 { increment = 0.5 }
}
Expand Down
2 changes: 2 additions & 0 deletions Cosmos/CosmosRating.swift
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,8 @@ struct CosmosRating {
return Double(round(starFillLevel * 2) / 2)
case .precise :
return starFillLevel
case .quarter:
return Double(round(starFillLevel * 4) / 4)
}
}

Expand Down
3 changes: 3 additions & 0 deletions Cosmos/StarFillMode.swift
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,7 @@ public enum StarFillMode: Int {

/// Fill star according to decimal rating. For example, fourth star will be 20% filled for 3.2.
case precise = 2

/// Show fully filled and half-filled , quarter-filled stars. For example, fourth star will be quarter filled for 3.75.
case quarter = 3
}
27 changes: 27 additions & 0 deletions CosmosTests/CosmosRatingTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,9 @@ class CosmosDisplayedRatingTests: XCTestCase {
var result = CosmosRating.displayedRatingFromPreciseRating(4.6, fillMode: .half, totalStars: 5)
XCTAssertEqual(4.5, result)

result = CosmosRating.displayedRatingFromPreciseRating(4.6, fillMode: .quarter, totalStars: 5)
XCTAssertEqual(4.5, result)

result = CosmosRating.displayedRatingFromPreciseRating(4.6, fillMode: .full, totalStars: 5)
XCTAssertEqual(5, result)

Expand All @@ -22,10 +25,16 @@ class CosmosDisplayedRatingTests: XCTestCase {
var result = CosmosRating.displayedRatingFromPreciseRating(7, fillMode: .half, totalStars: 5)
XCTAssertEqual(5, result)

result = CosmosRating.displayedRatingFromPreciseRating(7, fillMode: .quarter, totalStars: 5)
XCTAssertEqual(5, result)


// Rating is less than zero
result = CosmosRating.displayedRatingFromPreciseRating(-1, fillMode: .half, totalStars: 5)
XCTAssertEqual(0, result)

result = CosmosRating.displayedRatingFromPreciseRating(-1, fillMode: .quarter, totalStars: 5)
XCTAssertEqual(0, result)
}

// MARK: - Star fill level
Expand Down Expand Up @@ -53,6 +62,12 @@ class CosmosDisplayedRatingTests: XCTestCase {

XCTAssertEqual(0.5, result)
}

func testStarFillLevel_partiallyFileldQuarter() {
let result = CosmosRating.starFillLevel(ratingRemainder: 0.67, fillMode: .quarter)

XCTAssertEqual(0.75, result)
}

func testStarFillLevel_partiallyFileldFull() {
let result = CosmosRating.starFillLevel(ratingRemainder: 0.67, fillMode: .full)
Expand Down Expand Up @@ -80,6 +95,18 @@ class CosmosDisplayedRatingTests: XCTestCase {
XCTAssertEqual(1, CosmosRating.roundFillLevel(0.9, fillMode: .half))
XCTAssertEqual(1, CosmosRating.roundFillLevel(1, fillMode: .half))
}

func testRoundFillLevel_quarter() {
XCTAssertEqual(0, CosmosRating.roundFillLevel(0, fillMode: .quarter))
XCTAssertEqual(0.0, CosmosRating.roundFillLevel(0.1, fillMode: .quarter))
XCTAssertEqual(0.25, CosmosRating.roundFillLevel(0.25, fillMode: .quarter))
XCTAssertEqual(0.25, CosmosRating.roundFillLevel(0.3, fillMode: .quarter))
XCTAssertEqual(0.5, CosmosRating.roundFillLevel(0.5, fillMode: .quarter))
XCTAssertEqual(0.5, CosmosRating.roundFillLevel(0.6, fillMode: .quarter))
XCTAssertEqual(0.75, CosmosRating.roundFillLevel(0.75, fillMode: .quarter))
XCTAssertEqual(1, CosmosRating.roundFillLevel(0.9, fillMode: .quarter))
XCTAssertEqual(1, CosmosRating.roundFillLevel(1, fillMode: .quarter))
}

func testRoundFillLevel_precise() {
XCTAssertEqual(0, CosmosRating.roundFillLevel(0, fillMode: .precise))
Expand Down
9 changes: 7 additions & 2 deletions Distrib/CosmosDistrib.swift
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,9 @@ public enum StarFillMode: Int {

/// Fill star according to decimal rating. For example, fourth star will be 20% filled for 3.2.
case precise = 2

/// Show fully filled and half-filled , quarter-filled stars. For example, fourth star will be quarter filled for 3.75.
case quarter = 3
}


Expand Down Expand Up @@ -275,7 +278,7 @@ struct CosmosAccessibility {
increment = ceil(rating) - rating
if increment == 0 { increment = 1 }

case .half, .precise:
case .half, .precise, .quarter:
increment = (ceil(rating * 2) - rating * 2) / 2
if increment == 0 { increment = 0.5 }
}
Expand All @@ -294,7 +297,7 @@ struct CosmosAccessibility {
increment = rating - floor(rating)
if increment == 0 { increment = 1 }

case .half, .precise:
case .half, .precise, .quarter:
increment = (rating * 2 - floor(rating * 2)) / 2
if increment == 0 { increment = 0.5 }
}
Expand Down Expand Up @@ -938,6 +941,8 @@ struct CosmosRating {
return Double(round(starFillLevel * 2) / 2)
case .precise :
return starFillLevel
case .quarter:
return Double(round(starFillLevel * 4) / 4)
}
}

Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,7 @@ cosmosView.settings.updateOnTouch = false

// Show only fully filled stars
cosmosView.settings.fillMode = .full
// Other fill modes: .half, .precise
// Other fill modes: .half, .precise, .quarter

// Change the size of the stars
cosmosView.settings.starSize = 30
Expand Down