You are reviewing an automated UI test suite. Decide whether the test suite checks one acceptance criterion. ## Rubric Answer with exactly one verdict: - **covered**: a test performs the action the criterion describes and asserts the outcome the criterion names. When the criterion describes a single example ("a product", "an item"), one example is enough. A test that reaches the same result by a different route or with a different style of assertion still counts. - **partial**: a test asserts only part of the named outcome, or covers only some of the cases the criterion names. - **missing**: no test that runs asserts the named outcome, or the only assertion would pass whether or not the outcome happened. Judge only what the code checks, not whether the site behaves correctly, whether the test is fast, or whether the criterion itself is well written. Assume the tests run 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 The default sort is Name (A to Z), and the first product is "Sauce Labs Backpack" ## 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": "