# Copyright 2024 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

*** Comments ***
Tests for sencha system from bootup to running one iteration of the soundstream demo.

*** Settings ***
Resource  resources/sencha.resource
Variables  variables/common.py
Variables  variables/${PLATFORM}_${BUILD_TYPE}.py

*** Test Cases ***
Test Soundstream
    Prepare SenchaMachine
    Start Emulation
    Create Terminal Tester      ${SMC_UART}

    Wait For Line On Uart       SOUNDSTREAM: soundstream (Thread 0x1)
    Wait For Line On Uart       SOUNDSTREAM: Setup complete
    Wait For Line On Uart       SOUNDSTREAM: Start recording
    Wait For Line On Uart       SOUNDSTREAM: Done recording
    Wait For Line On Uart       SOUNDSTREAM: Processing recorded audio

    # NB: one audio collection generates 6 ML ops
    FOR    ${iter}    IN RANGE    5
      Wait For Line On Uart     SOUNDSTREAM: Iteration ${iter}
      Wait For Line On Uart     SOUNDSTREAM: [sound]::ENCODER:
    END
    Wait For Line On Uart       SOUNDSTREAM: [sound]::ENCODER: done

    Wait For Line On Uart       SOUNDSTREAM: Done with processing
