mirror of
https://github.com/dutchcoders/transfer.sh.git
synced 2024-12-04 09:50:18 +01:00
182 lines
3.9 KiB
Go
182 lines
3.9 KiB
Go
// go-qrcode
|
|
// Copyright 2014 Tom Harwood
|
|
|
|
package reedsolomon
|
|
|
|
import (
|
|
"testing"
|
|
)
|
|
|
|
func TestGFPolyAdd(t *testing.T) {
|
|
// a + b == result
|
|
var tests = []struct {
|
|
a gfPoly
|
|
b gfPoly
|
|
result gfPoly
|
|
}{
|
|
{
|
|
gfPoly{[]gfElement{0, 0, 0}},
|
|
gfPoly{[]gfElement{0}},
|
|
gfPoly{[]gfElement{}},
|
|
},
|
|
{
|
|
gfPoly{[]gfElement{1, 0}},
|
|
gfPoly{[]gfElement{1, 0}},
|
|
gfPoly{[]gfElement{0, 0}},
|
|
},
|
|
{
|
|
gfPoly{[]gfElement{0xA0, 0x80, 0xFF, 0x00}},
|
|
gfPoly{[]gfElement{0x0A, 0x82}},
|
|
gfPoly{[]gfElement{0xAA, 0x02, 0xFF}},
|
|
},
|
|
}
|
|
|
|
for _, test := range tests {
|
|
result := gfPolyAdd(test.a, test.b)
|
|
|
|
if !test.result.equals(result) {
|
|
t.Errorf("%s * %s != %s (got %s)\n", test.a.string(false), test.b.string(false),
|
|
test.result.string(false), result.string(false))
|
|
}
|
|
|
|
if len(result.term) > 0 && result.term[len(result.term)-1] == 0 {
|
|
t.Errorf("Result's maximum term coefficient is zero")
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestGFPolyequals(t *testing.T) {
|
|
// a == b if isEqual
|
|
var tests = []struct {
|
|
a gfPoly
|
|
b gfPoly
|
|
isEqual bool
|
|
}{
|
|
{
|
|
gfPoly{[]gfElement{0}},
|
|
gfPoly{[]gfElement{0}},
|
|
true,
|
|
},
|
|
{
|
|
gfPoly{[]gfElement{1}},
|
|
gfPoly{[]gfElement{0}},
|
|
false,
|
|
},
|
|
{
|
|
gfPoly{[]gfElement{1, 0, 1, 0, 1}},
|
|
gfPoly{[]gfElement{1, 0, 1, 0, 1}},
|
|
true,
|
|
},
|
|
{
|
|
gfPoly{[]gfElement{1, 0, 1}},
|
|
gfPoly{[]gfElement{1, 0, 1, 0, 0}},
|
|
true,
|
|
},
|
|
}
|
|
|
|
for _, test := range tests {
|
|
isEqual := test.a.equals(test.b)
|
|
|
|
if isEqual != test.isEqual {
|
|
t.Errorf("%s and %s equality is %t (got %t)\n", test.a.string(false), test.b.string(false),
|
|
test.isEqual, isEqual)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestGFPolyMultiply(t *testing.T) {
|
|
// a * b == result
|
|
var tests = []struct {
|
|
a gfPoly
|
|
b gfPoly
|
|
result gfPoly
|
|
}{
|
|
{
|
|
gfPoly{[]gfElement{0, 0, 1}},
|
|
gfPoly{[]gfElement{9}},
|
|
gfPoly{[]gfElement{0, 0, 9}},
|
|
},
|
|
{
|
|
gfPoly{[]gfElement{0, 16, 1}},
|
|
gfPoly{[]gfElement{128, 2}},
|
|
gfPoly{[]gfElement{0, 232, 160, 2}},
|
|
},
|
|
{
|
|
gfPoly{[]gfElement{254, 120, 88, 44, 11, 1}},
|
|
gfPoly{[]gfElement{16, 2, 0, 51, 44}},
|
|
gfPoly{[]gfElement{91, 50, 25, 184, 194, 105, 45, 244, 58, 44}},
|
|
},
|
|
}
|
|
|
|
for _, test := range tests {
|
|
result := gfPolyMultiply(test.a, test.b)
|
|
|
|
if !test.result.equals(result) {
|
|
t.Errorf("%s * %s = %s (got %s)\n",
|
|
test.a.string(false),
|
|
test.b.string(false),
|
|
test.result.string(false),
|
|
result.string(false))
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestGFPolyRemainder(t *testing.T) {
|
|
// numerator / denominator == quotient + remainder.
|
|
var tests = []struct {
|
|
numerator gfPoly
|
|
denominator gfPoly
|
|
remainder gfPoly
|
|
}{
|
|
{
|
|
gfPoly{[]gfElement{1}},
|
|
gfPoly{[]gfElement{1}},
|
|
gfPoly{[]gfElement{0}},
|
|
},
|
|
{
|
|
gfPoly{[]gfElement{1, 0}},
|
|
gfPoly{[]gfElement{1}},
|
|
gfPoly{[]gfElement{0}},
|
|
},
|
|
{
|
|
gfPoly{[]gfElement{1}},
|
|
gfPoly{[]gfElement{1, 0}},
|
|
gfPoly{[]gfElement{1}},
|
|
},
|
|
{
|
|
gfPoly{[]gfElement{1, 0, 1}},
|
|
gfPoly{[]gfElement{0, 1}},
|
|
gfPoly{[]gfElement{1}},
|
|
},
|
|
// (x^12 + x^10) / (x^10 + x^8 + x^5 + x^4 + x^2 + x^1 + x^0) =
|
|
// (x^10 + x^8 + x^5 + x^4 + x^2 + x^1 + x^0) * x^2 +
|
|
// (x^7 + x^6 + x^4 + x^3 + x^2) (the remainder)
|
|
{
|
|
gfPoly{[]gfElement{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1}},
|
|
gfPoly{[]gfElement{1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1}},
|
|
gfPoly{[]gfElement{0, 0, 1, 1, 1, 0, 1, 1}},
|
|
},
|
|
{
|
|
gfPoly{[]gfElement{91, 50, 25, 184, 194, 105, 45, 244, 58, 44}},
|
|
gfPoly{[]gfElement{254, 120, 88, 44, 11, 1}},
|
|
gfPoly{[]gfElement{}},
|
|
},
|
|
{
|
|
gfPoly{[]gfElement{0, 0, 0, 0, 0, 0, 195, 172, 24, 64}},
|
|
gfPoly{[]gfElement{116, 147, 63, 198, 31, 1}},
|
|
gfPoly{[]gfElement{48, 174, 34, 13, 134}},
|
|
},
|
|
}
|
|
|
|
for _, test := range tests {
|
|
remainder := gfPolyRemainder(test.numerator, test.denominator)
|
|
|
|
if !test.remainder.equals(remainder) {
|
|
t.Errorf("%s / %s, remainder = %s (got %s)\n",
|
|
test.numerator.string(false),
|
|
test.denominator.string(false),
|
|
test.remainder.string(false),
|
|
remainder.string(false))
|
|
}
|
|
}
|
|
}
|