Acceptance test
Demonstration of all of the functional and non-functional requirements. This can be a combination of automated tests derived from the use-cases (user stories) and manual tests with recorded observation of the results.
Acceptance Test Documentation
Acceptance tests verify that the system meets its functional and non-functional requirements from the perspective of an end user. Each test is derived directly from a use-case. Automated tests are indicated where all assertions can be made programmatically; manual tests include an observation record table for sign-off.
Use Case 1 — Account Creation
User story: As a user, I want to create an account so that I can store and access my personalized communication preferences.
Test type: Manual
Preconditions:
- The AAC Beacon web application is accessible.
- The user has not previously registered.
Test steps:
- Navigate to the AAC Beacon application for the first time.
- Verify a landing page is shown with "Register" and "Login" options.
- Select "Register".
- Enter a valid username, email address, and password.
- Choose account type (admin or child).
- Optionally enter accessibility preferences.
- Select "Sign Up".
- Verify a confirmation message is displayed.
- Select "Sign In" and enter the new credentials.
- Verify redirection to the home page.
Acceptance criteria:
- Registration form accepts valid inputs and displays a success confirmation.
- Account type selection (admin / child) is available and selectable.
- After sign-in with new credentials, the user lands on the home page.
- Attempting to register with an already-used email shows an appropriate error.
Observation record:
| Step | Expected result | Observed result | Pass/Fail |
|---|---|---|---|
| Landing page shown | Register and Login options visible | ||
| Register form loads | Form fields present for username, email, password, account type | ||
| Valid submission | Success confirmation displayed | ||
| Sign in with new credentials | Redirected to home page | ||
| Duplicate email registration | Error message displayed |
Use Case 2 — Signing In
User story: As a user, I want to log into my account so that I can access my personalized communication vocabulary.
Test type: Manual + Automated (credential validation logic)
Preconditions:
- A registered account exists.
Test steps:
- Navigate to the AAC Beacon application.
- Select "Login".
- Enter valid email and password.
- Verify redirection to the home page.
- Repeat with invalid credentials and verify an error notification is shown.
Acceptance criteria:
- Valid credentials redirect the user to the home page.
- Invalid credentials display an error notification and prompt the user to try again.
- The login page is accessible from the landing page.
Automated assertions (credential validation):
- Submitting with empty fields does not proceed and shows validation messages.
- Submitting with a valid email format and non-empty password attempts authentication.
Observation record:
| Step | Expected result | Observed result | Pass/Fail |
|---|---|---|---|
| Login page accessible | Login form visible | ||
| Valid credentials | Redirected to home page | ||
| Invalid credentials | Error notification shown, user prompted to retry | ||
| Empty field submission | Validation error shown, no request sent |
Use Case 3 — Connecting to a Beacon
User story: As a child user, I want to connect to a beacon in a room so that I can quickly access vocabulary tailored to that location.
Test type: Automated (manual selection path) + Manual (physical BLE)
Preconditions:
- At least one room is defined in the data layer.
- For the manual test: a physical beacon device is active in the room.
Automated test steps:
- Render
useLocationDetection. - Call
setRoomManually('kitchen'). - Assert
currentRoomandallRooms.
Automated assertions:
- Before selection:
currentRoomisnull. - After
setRoomManually('kitchen'):currentRoomequals{ id: 'kitchen', label: 'Kitchen' }. allRoomscontains all rooms from the data layer.detectionModeis'manual'.
Manual observation (physical BLE beacon):
| Action | Expected result | Observed result | Pass/Fail |
|---|---|---|---|
| Enter room with active beacon | App detects beacon automatically | ||
| Beacon detected | Room-specific vocabulary loads and displays | ||
| Leave room | currentRoom clears or switches | ||
| Re-enter room | Vocabulary reloads for that room |
Use Case 4 — Using Vocabulary for Communication
User story: As a user, I want to quickly select words from my personalized vocabulary so that I can communicate efficiently.
Test type: Automated
Preconditions:
- A room vocabulary is loaded (or default vocabulary is available).
Automated test steps:
- Render
useSentenceBuilderwithonLogPresswired touseInteractionLogger. - Call
addWordfor'I','want','juice'. - Call
speakSentence. - Call
removeLastWord. - Call
clearSentence.
Automated assertions:
- After adding three words:
sentenceequals['I', 'want', 'juice']. speakis called with'I','want','juice'individually (immediate feedback).speakSentencecallsspeak('I want juice')andAlert.alert('Speaking', 'I want juice').removeLastWordreducessentenceto['I', 'want'].clearSentenceresetssentenceto[]and callsstop().interactionLogsrecords every action with correct event names and payloads.- All operations work identically when no room is selected (
currentRoomisnull).
Use Case 5 — Updating Favorite Words
User story: As an admin user, I want to update my frequently used words so that the system reflects my communication needs.
Test type: Manual
Preconditions:
- The user is signed in with an admin account.
- At least one vocabulary set exists linked to a room or general usage.
Test steps:
- Navigate to the vocabulary preferences page.
- Select a vocabulary set linked to a specific room (e.g., Kitchen).
- Add a new word to the set.
- Remove an existing unused word from the set.
- Save the updates.
- Verify the system confirms synchronisation with associated beacons.
- Connect to the corresponding beacon room and verify the updated vocabulary is displayed.
Acceptance criteria:
- Admin users can add and remove words from any vocabulary set.
- Saving updates triggers synchronisation confirmation.
- The updated vocabulary appears on the device after connecting to the associated room's beacon.
- Child accounts do not have access to the vocabulary management page.
Observation record:
| Step | Expected result | Observed result | Pass/Fail |
|---|---|---|---|
| Vocabulary page accessible (admin) | Page loads with vocabulary sets | ||
| Room-specific set selected | Words for that room displayed | ||
| Word added and saved | New word appears in vocabulary set | ||
| Word removed and saved | Removed word no longer appears | ||
| Sync confirmation shown | Message or indicator confirms sync | ||
| Room beacon reconnected | Updated vocabulary visible on device | ||
| Child account attempts access | Access denied or option not visible |
Use Case 6 — Beacon Connection Failure Handling
User story: As a user, I want to be notified if a beacon connection fails so that I can still access my communication tools.
Test type: Automated (fallback behaviour) + Manual (notification to admin)
Preconditions:
- The system attempts beacon detection on room entry.
Automated test steps:
- Render
useLocationDetectionwithout callingsetRoomManually. - Render
useSentenceBuilderanduseInteractionLoggerwithcurrentRoomasnull. - Perform a full communication sequence (add words, speak, clear).
Automated assertions:
currentRoomremainsnull(connection never succeeded).- All sentence operations (
addWord,speakSentence,removeLastWord,clearSentence) complete without error. - All
interactionLogsentries havelocation: { id: 'general', label: 'General' }. speakis called correctly for individual words and the full sentence.- No exceptions are thrown throughout the session.
Manual observation (failure notification):
| Action | Expected result | Observed result | Pass/Fail |
|---|---|---|---|
| Enter room, beacon unreachable | Admin receives connection failure notification | ||
| Connection failure occurs | Default / last-used vocabulary loads automatically | ||
| Child user attempts communication | Communication tools fully available despite failure | ||
| Beacon becomes available again | App reconnects and loads room vocabulary |
Non-Functional Requirements
NFR1 — Word tile selection responds without perceptible delay
Requirement: Speech feedback must begin within 200 ms of a tile tap.
Test type: Manual
Procedure:
- Launch the app on a physical or emulated device.
- Tap a word tile and observe the spoken response time.
- Repeat 10 times with different tiles.
Acceptance criterion: Speech begins within 200 ms on all 10 attempts.
Observation record:
| Attempt | Tile | Response time (ms) | Pass/Fail |
|---|---|---|---|
| 1 | |||
| 2 | |||
| 3 | |||
| 4 | |||
| 5 | |||
| 6 | |||
| 7 | |||
| 8 | |||
| 9 | |||
| 10 |
NFR2 — Pictogram images load within 3 seconds on a standard connection
Requirement: All pictograms on a screen must be visible within 3 seconds of the screen mounting.
Test type: Manual
Procedure:
- Clear the in-memory pictogram cache (restart app).
- Navigate to a screen with 6 word tiles.
- Measure time from screen mount to all images being visible.
Acceptance criterion: All pictograms displayed within 3 seconds.
Observation record:
| Screen | Tiles | Time to fully loaded (s) | Pass/Fail |
|---|---|---|---|
| Default vocabulary | 6 | ||
| Kitchen context | 6 | ||
| Bedroom context | 6 |
NFR3 — Communication remains uninterrupted during a beacon failure
Requirement: A beacon connection failure must not block or delay communication for the child user.
Test type: Automated
Automated assertions:
- With
currentRoomnull, all ofaddWord,speakSentence,removeLastWord, andclearSentencecomplete without error or delay. interactionLogsare recorded correctly using the'general'location fallback.
NFR4 — The system handles edge-case inputs without crashing
Requirement: No user action or unexpected input should cause the app to crash or enter an invalid state.
Test type: Automated
Automated assertions:
removeLastWordon an empty sentence →sentencestays[], no exception.speakSentenceon an empty sentence →speaknot called,Alert.alertnot called, no exception.setRoomManuallywith an unknown ID →currentRoomisnull, no exception.clearSentencewhen already empty →sentenceis[],stopcalled, no exception.logButtonPresswith no metadata argument → entry recorded without error.
NFR5 — Sensor resources are released when navigation leaves the movement sensor screen
Requirement: The Accelerometer subscription must be removed when stop() is called to prevent memory leaks and duplicate listeners.
Test type: Automated
Automated assertions:
subscription.remove()is called exactly once whenstop()is invoked.- No further listener callbacks fire after
stop()is called.