Assemble Remote speech before reader delivery
This commit is contained in:
1 parent
f23e89ed93
commit
205cb27483
9 files changed
+492
-33
No files matched your search
@@ -90,3 +90,63 @@ func TestRemoteSpeechEncodedBoundary(t *testing.T) {
|
||||
t.Fatal("accepted invalid UTF-8")
|
||||
}
|
||||
}
|
||||
|
||||
func TestRemoteSpeechPresentationSDKValidation(t *testing.T) {
|
||||
base := `"lease":"` + strings.Repeat("a", 32) + `","epoch":1,"sequence":3,"speech":{"kind":"speak","parts":[{"text":"x"}]}`
|
||||
cases := []struct {
|
||||
fields string
|
||||
valid bool
|
||||
}{
|
||||
{"", true},
|
||||
{`,"utterance":3`, true},
|
||||
{`,"utterance":1,"final":true`, true},
|
||||
{`,"utterance":0,"final":false`, true},
|
||||
{`,"utterance":4`, false},
|
||||
{`,"utterance":-1`, false},
|
||||
{`,"utterance":true`, false},
|
||||
{`,"utterance":null`, false},
|
||||
{`,"utterance":18446744073709551616`, false},
|
||||
{`,"final":true`, false},
|
||||
{`,"utterance":1,"final":1`, false},
|
||||
{`,"utterance":1,"final":null`, false},
|
||||
{`,"extra":1`, false},
|
||||
}
|
||||
var pythonCases []any
|
||||
for _, item := range cases {
|
||||
data := []byte(`{` + base + item.fields + `}`)
|
||||
var request RemotePresentation
|
||||
if valid := DecodeStrict(data, &request) == nil && ValidRemotePresentation(request); valid != item.valid {
|
||||
t.Fatalf("Go presentation validation: %s: got %v", item.fields, valid)
|
||||
}
|
||||
// Use RawMessage when encoding the cases for Python, preserving uint64
|
||||
// boundaries rather than passing them through float64.
|
||||
pythonCases = append(pythonCases, map[string]any{"request": json.RawMessage(data), "valid": item.valid})
|
||||
}
|
||||
for _, kind := range []string{"cancel", "pause"} {
|
||||
request := RemotePresentation{RemoteOperation: RemoteOperation{Lease: strings.Repeat("a", 32), Epoch: 1, Sequence: 1}, Utterance: 1, Speech: RemoteSpeech{Kind: kind}}
|
||||
if kind == "pause" {
|
||||
paused := true
|
||||
request.Speech.Paused = &paused
|
||||
}
|
||||
if ValidRemotePresentation(request) {
|
||||
t.Fatal("grouped non-speak effect")
|
||||
}
|
||||
pythonCases = append(pythonCases, map[string]any{"request": request, "valid": false})
|
||||
}
|
||||
path, err := filepath.Abs("../../sdk/python")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
script := `import json, sys
|
||||
sys.path.insert(0, sys.argv[1])
|
||||
from cthulhu_tentacle.session import valid_remote_presentation
|
||||
for case in json.load(sys.stdin):
|
||||
assert valid_remote_presentation(case['request']) == case['valid'], str(case)[:180]
|
||||
`
|
||||
data, _ := json.Marshal(pythonCases)
|
||||
command := exec.Command("python3", "-B", "-c", script, path)
|
||||
command.Stdin = strings.NewReader(string(data))
|
||||
if output, err := command.CombinedOutput(); err != nil {
|
||||
t.Fatalf("Python presentation validation: %v: %s", err, output)
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user