roman: check number range
This commit is contained in:
		@ -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
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user