web-tuner/shift_test.go

90 lines
1.8 KiB
Go

package main
import (
"testing"
)
func TestStandardTuningAppearsForEMajor(t *testing.T) {
query := ShapeQuery{
Shape: ShapeDefinition{"E major", []int{0, 2, 2, 1, 0, 0}},
TargetQuality: "major",
TargetRoot: -1,
RangeDown: 7,
RangeUp: 7,
}
results, err := findCandidateTunings(query)
if err != nil {
t.Fatal(err)
}
std := []int{40, 45, 50, 55, 59, 64}
found := false
for _, r := range results {
match := true
for s := 0; s < 6; s++ {
if r.tuningMIDI[s] != std[s] {
match = false
break
}
}
if match {
found = true
break
}
}
if !found {
t.Error("Standard tuning not found for E major shape + major quality")
}
}
func TestBStandardReturnsItself(t *testing.T) {
// B standard = 5 semitones down from E standard
bStd := []int{35, 40, 45, 50, 54, 59} // B1 E2 A2 D3 F#3 B3
query := ShapeQuery{
Shape: ShapeDefinition{"E major", []int{0, 2, 2, 1, 0, 0}},
TargetQuality: "major",
TargetRoot: -1,
BaseTuning: bStd,
RangeDown: 3,
RangeUp: 3,
}
results, err := findCandidateTunings(query)
if err != nil {
t.Fatal(err)
}
t.Logf("Total candidates: %d", len(results))
found := false
for _, r := range results {
match := true
for s := 0; s < 6; s++ {
if r.tuningMIDI[s] != bStd[s] {
match = false
break
}
}
if match {
found = true
t.Logf("B standard found: root=%d midi=%v", r.root, r.tuningMIDI)
break
}
}
if !found {
for i, r := range results {
if i >= 10 {
break
}
shifts := make([]int, 6)
for s := 0; s < 6; s++ {
shifts[s] = r.tuningMIDI[s] - bStd[s]
}
t.Logf(" root=%d midi=%v shifts=%v", r.root, r.tuningMIDI, shifts)
}
t.Error("B standard tuning not found when BaseTuning=B standard, range ±3")
}
}