roman: check number range
This commit is contained in:
parent
abc546178d
commit
8629b537b0
@ -1,6 +1,9 @@
|
||||
package roman
|
||||
|
||||
import "strings"
|
||||
import (
|
||||
"errors"
|
||||
"strings"
|
||||
)
|
||||
|
||||
type RomanNumeral struct {
|
||||
Value uint16
|
||||
@ -24,7 +27,12 @@ var allRomanNumerals = []RomanNumeral{
|
||||
{1, "I"},
|
||||
}
|
||||
|
||||
func ConvertToRoman(arabic uint16) string {
|
||||
var ErrNumberOutOfRange = errors.New("numbers should not be bigger than 3999")
|
||||
|
||||
func ConvertToRoman(arabic uint16) (string, error) {
|
||||
if arabic > 3999 {
|
||||
return "", ErrNumberOutOfRange
|
||||
}
|
||||
var converted strings.Builder
|
||||
for _, numeral := range allRomanNumerals {
|
||||
for arabic >= numeral.Value {
|
||||
@ -33,9 +41,10 @@ func ConvertToRoman(arabic uint16) string {
|
||||
}
|
||||
}
|
||||
|
||||
return converted.String()
|
||||
return converted.String(), nil
|
||||
}
|
||||
|
||||
// XXX: This convert function doesn't check the validity of the roman numerals string
|
||||
func ConvertToArabic(roman string) uint16 {
|
||||
var converted uint16
|
||||
for _, numeral := range allRomanNumerals {
|
||||
|
@ -44,7 +44,7 @@ var cases = []struct {
|
||||
func TestRomanNemerals(t *testing.T) {
|
||||
for _, test := range cases {
|
||||
t.Run(fmt.Sprintf("%d gets converted to %q", test.Arabic, test.Roman), func(t *testing.T) {
|
||||
got := ConvertToRoman(test.Arabic)
|
||||
got, _ := ConvertToRoman(test.Arabic)
|
||||
want := test.Roman
|
||||
|
||||
if got != want {
|
||||
@ -69,10 +69,10 @@ func TestConvertingToArabic(t *testing.T) {
|
||||
|
||||
func TestPropertiesOfConversion(t *testing.T) {
|
||||
assertion := func(arabic uint16) bool {
|
||||
roman, err := ConvertToRoman(arabic)
|
||||
if arabic > 3999 {
|
||||
return true
|
||||
return err == ErrNumberOutOfRange
|
||||
}
|
||||
roman := ConvertToRoman(arabic)
|
||||
fromRoman := ConvertToArabic(roman)
|
||||
return fromRoman == arabic
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user