60 lines
1.1 KiB
Go
60 lines
1.1 KiB
Go
|
package terminal
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"math/rand"
|
||
|
"strings"
|
||
|
. "testing"
|
||
|
"time"
|
||
|
)
|
||
|
|
||
|
func TestMat(t *T) {
|
||
|
r := rand.New(rand.NewSource(time.Now().UnixNano()))
|
||
|
|
||
|
type xy struct {
|
||
|
x, y int
|
||
|
}
|
||
|
|
||
|
type action struct {
|
||
|
xy
|
||
|
set int
|
||
|
}
|
||
|
|
||
|
run := func(aa []action) {
|
||
|
aaStr := func(i int) string {
|
||
|
s := fmt.Sprintf("%#v", aa[:i+1])
|
||
|
return strings.Replace(s, "terminal.", "", -1)
|
||
|
}
|
||
|
|
||
|
m := newMat()
|
||
|
mm := map[xy]int{}
|
||
|
for i, a := range aa {
|
||
|
if a.set > 0 {
|
||
|
mm[a.xy] = a.set
|
||
|
m.set(a.xy.x, a.xy.y, a.set)
|
||
|
continue
|
||
|
}
|
||
|
|
||
|
expI, expOk := mm[a.xy]
|
||
|
gotI, gotOk := m.get(a.xy.x, a.xy.y).(int)
|
||
|
if expOk != gotOk {
|
||
|
t.Fatalf("get failed: expOk:%v gotOk:%v actions:%#v", expOk, gotOk, aaStr(i))
|
||
|
} else if expI != gotI {
|
||
|
t.Fatalf("get failed: expI:%v gotI:%v actions:%#v", expI, gotI, aaStr(i))
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
for i := 0; i < 10000; i++ {
|
||
|
var actions []action
|
||
|
for j := r.Intn(1000); j > 0; j-- {
|
||
|
a := action{xy: xy{x: r.Intn(5), y: r.Intn(5)}}
|
||
|
if r.Intn(3) == 0 {
|
||
|
a.set = r.Intn(10000) + 1
|
||
|
}
|
||
|
actions = append(actions, a)
|
||
|
}
|
||
|
run(actions)
|
||
|
}
|
||
|
}
|