From 8629b537b0a4c5b022e4511671f013b56299963b Mon Sep 17 00:00:00 2001 From: vinchent Date: Sun, 22 Sep 2024 22:00:50 +0200 Subject: [PATCH] roman: check number range --- roman/roman.go | 15 ++++++++++++--- roman/roman_test.go | 6 +++--- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/roman/roman.go b/roman/roman.go index 63e8ec1..8a3b8e5 100644 --- a/roman/roman.go +++ b/roman/roman.go @@ -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 { diff --git a/roman/roman_test.go b/roman/roman_test.go index d6609bb..1495bbf 100644 --- a/roman/roman_test.go +++ b/roman/roman_test.go @@ -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 }