#include "speech_control.h"
#include "button_gesture.h"
#include <cassert>
#include <deque>
int main() {
    SpeechStream s;
    assert(!s.start("x",48000,16,1));assert(s.start("one",44100,16,1));
    assert(s.chunk("one",0,7056));assert(!s.chunk("stale",0,7056));assert(s.id=="one");
    assert(!s.chunk("one",2,7056));assert(s.id.empty());
    assert(s.start("two",44100,16,1));assert(!s.chunk("two",0,7057));assert(s.id.empty());
    assert(s.start("three",44100,16,1));assert(s.chunk("three",0,2));
    assert(!s.end("old",1));assert(s.end("three",1));assert(!s.chunk("three",1,2));
    // Host fake-device bounded queue: cancel, never silently drop a chunk.
    std::deque<int> queue;
    assert(s.start("queue",44100,16,1));
    for (unsigned i=0;i<9;++i) {assert(s.chunk("queue",i,7056));if(queue.size()==8){queue.clear();s.stop();break;}queue.push_back(i);}
    assert(s.id.empty() && queue.empty());
    SpeechMenu menu;menu.open();assert(menu.label()=="AGENT SETTINGS");
    assert(menu.click(false)==SpeechMenuAction::AGENT_SETTINGS);
    menu.click(true);assert(menu.label()=="SPEECH");assert(menu.click(false)==SpeechMenuAction::LOAD_SPEECH);
    menu.load("AUTO_REPLY");assert(menu.mode==2);
    menu.click(false);menu.click(true);assert(menu.mode==3);assert(menu.click(false)==SpeechMenuAction::SAVE_MODE);
    menu.click(true);assert(menu.label()=="READ SCREEN NOW");assert(menu.click(false)==SpeechMenuAction::READ_SCREEN);
    menu.open();assert(menu.page==SpeechMenu::Page::ROOT);
    // Long B enters settings once; releasing does not accidentally select.
    ButtonGesture b;b.update(true,0,1,true);b.update(true,30,1,true);
    assert(b.update(true,630,1,true)==Gesture::LONG);menu.open();
    b.update(false,700,2,true);assert(b.update(false,730,2,true)==Gesture::LONG_RELEASE);
    assert(menu.page==SpeechMenu::Page::ROOT);
    // Approval invalidates any in-progress menu press.
    ButtonGesture a;a.update(true,0,2,true);a.update(true,30,2,true);
    a.update(false,100,3,false);assert(a.update(false,130,3,false)==Gesture::NONE);
}
