You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

71 lines
2.9 KiB
Go

package ent
import (
"testing"
)
// thanks to @spheenik and @invokr for the expected huffman codes. these are
// ripped from the huffman trees that are known to be working in clarity and
// manta.
var expected_codes = map[string]string{
"PlusOne": "0",
"FieldPathEncodeFinish": "10",
"PlusTwo": "1110",
"PushOneLeftDeltaNRightNonZeroPack6Bits": "1111",
"PushOneLeftDeltaOneRightNonZero": "11000",
"PlusN": "11010",
"PlusThree": "110010",
"PopAllButOnePlusOne": "110011",
"PushOneLeftDeltaNRightNonZero": "11011001",
"PushOneLeftDeltaOneRightZero": "11011010",
"PushOneLeftDeltaNRightZero": "11011100",
"PopAllButOnePlusNPack6Bits": "11011110",
"PlusFour": "11011111",
"PopAllButOnePlusN": "110110000",
"PushOneLeftDeltaNRightNonZeroPack8Bits": "110110110",
"NonTopoPenultimatePlusOne": "110110111",
"PopAllButOnePlusNPack3Bits": "110111010",
"PushNAndNonTopological": "110111011",
"NonTopoComplexPack4Bits": "1101100010",
"NonTopoComplex": "11011000111",
"PushOneLeftDeltaZeroRightZero": "110110001101",
"PopOnePlusOne": "110110001100001",
"PushOneLeftDeltaZeroRightNonZero": "110110001100101",
"PopNAndNonTopographical": "1101100011000000",
"PopNPlusN": "1101100011000001",
"PushN": "1101100011000100",
"PushThreePack5LeftDeltaN": "1101100011000101",
"PopNPlusOne": "1101100011000110",
"PopOnePlusN": "1101100011000111",
"PushTwoLeftDeltaZero": "1101100011001000",
"PushThreeLeftDeltaZero": "11011000110010010",
"PushTwoPack5LeftDeltaZero": "11011000110010011",
"PushTwoLeftDeltaN": "11011000110011000",
"PushThreePack5LeftDeltaOne": "11011000110011001",
"PushThreeLeftDeltaN": "11011000110011010",
"PushTwoPack5LeftDeltaN": "11011000110011011",
"PushTwoLeftDeltaOne": "11011000110011100",
"PushThreePack5LeftDeltaZero": "11011000110011101",
"PushThreeLeftDeltaOne": "11011000110011110",
"PushTwoPack5LeftDeltaOne": "11011000110011111",
}
func TestTree(t *testing.T) {
var testWalk func(node, string)
testWalk = func(n node, code string) {
switch v := n.(type) {
case lNode:
if expected_codes[v.name] != code {
t.Errorf("op %s has code %s, expected %s", v.name, code, expected_codes[v.name])
} else {
t.Logf("op %s has expected code %s", v.name, code)
}
case iNode:
testWalk(v.left, code+"0")
testWalk(v.right, code+"1")
}
}
testWalk(huffRoot, "")
}