You are reviewing an automated UI test suite. Decide whether the test suite checks one acceptance criterion. ## How to decide Ask one question first: **if the application broke this criterion in a realistic way, would some test in the suite fail?** Then apply these rules. 1. **Judge the criterion as written.** If the criterion itself is weak (it asks for little), a test that checks exactly what it asks is covered. Don't grade against a stricter requirement nobody wrote down. 2. **One example is enough, unless the other cases could realistically behave differently.** A single valid user for "valid credentials log in" is enough. It is not enough when the example sits on a boundary that hides likely bugs (for example, starting from an empty state, where "set to a value" and "change by one" look the same), or when the criterion states a rule for every item and items carry different data that could be wrong for some of them. 3. **Check what the criterion names, not a stand-in for it.** An address check is enough when the criterion names a kind of page ("returns to the products page"). It is not enough when the criterion is about specific content ("opens that product's page", "shows the same name and price"), because the right address can show the wrong content. 4. **Judge what actually happens when the test runs, not how the code looks.** A test written in an unusual or poor style still counts if it would fail when the outcome is wrong. A test that looks complete does not count fully if, because it doesn't wait for a page or element it depends on, the action the criterion describes doesn't reliably happen before the check. 5. **Any test in the suite can cover the criterion,** not only the one whose title matches it. ## Verdicts - **covered**: a realistic violation of the criterion would make a test fail. - **partial**: some realistic violations would make a test fail, others would not (for example, a wrong value fails but a missing element passes, only part of the named outcome is checked, only some of the named cases are tried, or the action happens only in some runs). - **missing**: no realistic violation would make a test fail. Judge only coverage of this criterion, not whether the site behaves correctly or whether the test is fast. Assume the tests run with Playwright against https://www.saucedemo.com with its usual `data-test` attributes. ## Feature Feature: Inventory Sorting As a logged-in customer, I want to sort the product list, So that I can find products by name or price. Acceptance Criteria: - The default sort is Name (A to Z), and the first product is "Sauce Labs Backpack" - Sorting by Name (Z to A) shows "Test.allTheThings() T-Shirt (Red)" first - Sorting by Price (low to high) shows "Sauce Labs Onesie" first, priced $7.99 - Sorting by Price (high to low) shows "Sauce Labs Fleece Jacket" first, priced $49.99 - The page shows 6 products after any sort ## Criterion Sorting by Price (low to high) shows "Sauce Labs Onesie" first, priced $7.99 ## Test suite ```js import { test, expect } from '@playwright/test'; const BASE_URL = 'https://www.saucedemo.com'; test.describe('Inventory Sorting', () => { test.beforeEach(async ({ page }) => { await page.goto(BASE_URL); await page.fill('[data-test="username"]', 'standard_user'); await page.fill('[data-test="password"]', 'secret_sauce'); await page.click('[data-test="login-button"]'); }); test('default sort is name A to Z with Sauce Labs Backpack first @smoke', async ({ page }) => { await expect(page.locator('[data-test="product-sort-container"]')).toHaveValue('az'); await expect(page.locator('[data-test="inventory-item-name"]').first()).toHaveText('Sauce Labs Backpack'); }); test('name Z to A shows the red T-shirt first @regression', async ({ page }) => { await page.selectOption('[data-test="product-sort-container"]', 'za'); await expect(page.locator('[data-test="inventory-item-name"]').first()).toHaveText('Test.allTheThings() T-Shirt (Red)'); }); test('price low to high shows the Onesie first at $7.99 @regression', async ({ page }) => { await page.selectOption('[data-test="product-sort-container"]', 'lohi'); await expect(page.locator('[data-test="inventory-item-name"]').first()).toHaveText('Sauce Labs Onesie'); await expect(page.locator('[data-test="inventory-item-price"]').first()).toHaveText('$7.99'); }); test('price high to low shows the Fleece Jacket first at $49.99 @regression', async ({ page }) => { await page.selectOption('[data-test="product-sort-container"]', 'hilo'); await expect(page.locator('[data-test="inventory-item-name"]').first()).toHaveText('Sauce Labs Fleece Jacket'); await expect(page.locator('[data-test="inventory-item-price"]').first()).toHaveText('$49.99'); }); test('six products are shown after sorting @regression', async ({ page }) => { await page.selectOption('[data-test="product-sort-container"]', 'hilo'); await expect(page.locator('[data-test="inventory-item"]')).toHaveCount(6); }); }); ``` ## Answer Reply with one line of JSON and nothing else: {"verdict": "covered" | "partial" | "missing", "test": "", "reason": "<one sentence>"}