package roman import ( "fmt" "testing" "testing/quick" ) var cases = []struct { Arabic uint16 Roman string }{ {Arabic: 1, Roman: "I"}, {Arabic: 2, Roman: "II"}, {Arabic: 3, Roman: "III"}, {Arabic: 4, Roman: "IV"}, {Arabic: 5, Roman: "V"}, {Arabic: 6, Roman: "VI"}, {Arabic: 7, Roman: "VII"}, {Arabic: 8, Roman: "VIII"}, {Arabic: 9, Roman: "IX"}, {Arabic: 10, Roman: "X"}, {Arabic: 14, Roman: "XIV"}, {Arabic: 18, Roman: "XVIII"}, {Arabic: 20, Roman: "XX"}, {Arabic: 39, Roman: "XXXIX"}, {Arabic: 40, Roman: "XL"}, {Arabic: 47, Roman: "XLVII"}, {Arabic: 49, Roman: "XLIX"}, {Arabic: 50, Roman: "L"}, {Arabic: 100, Roman: "C"}, {Arabic: 90, Roman: "XC"}, {Arabic: 400, Roman: "CD"}, {Arabic: 500, Roman: "D"}, {Arabic: 900, Roman: "CM"}, {Arabic: 1000, Roman: "M"}, {Arabic: 1984, Roman: "MCMLXXXIV"}, {Arabic: 3999, Roman: "MMMCMXCIX"}, {Arabic: 2014, Roman: "MMXIV"}, {Arabic: 1006, Roman: "MVI"}, {Arabic: 798, Roman: "DCCXCVIII"}, } 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) want := test.Roman if got != want { t.Errorf("got %q, want %q", got, want) } }) } } func TestConvertingToArabic(t *testing.T) { for _, test := range cases { t.Run(fmt.Sprintf("%q gets converted to %d", test.Roman, test.Arabic), func(t *testing.T) { got := ConvertToArabic(test.Roman) want := test.Arabic if got != want { t.Errorf("got %d, want %d", got, want) } }) } } func TestPropertiesOfConversion(t *testing.T) { assertion := func(arabic uint16) bool { roman, err := ConvertToRoman(arabic) if arabic > 3999 { return err == ErrNumberOutOfRange } fromRoman := ConvertToArabic(roman) return fromRoman == arabic } if err := quick.Check(assertion, &quick.Config{ MaxCount: 1000, }); err != nil { t.Error("failed checks", err) } }