@Override
    public List<ValidationEvent> validate(Model model) {
        OperationIndex operationIndex = OperationIndex.of(model);
        List<ValidationEvent> events = new ArrayList<>();
        for (Shape shape : model.getShapesWithTrait(SmokeTestsTrait.class)) {
            SmokeTestsTrait trait = shape.expectTrait(SmokeTestsTrait.class);
            List<SmokeTestCase> testCases = trait.getTestCases();

            for (SmokeTestCase testCase : testCases) {
                // Validate vendor params shape
                Optional<ShapeId> vendorParamsShapeIdOptional = testCase.getVendorParamsShape();
                Optional<ObjectNode> vendorParamsOptional = testCase.getVendorParams();
                if (vendorParamsShapeIdOptional.isPresent()) {
                    if (!vendorParamsOptional.isPresent()) {
                        events.add(warning(shape,
                                trait,
                                String.format(
                                        "Smoke test case with ID `%s` defined a `vendorParamsShape` but no `vendorParams`",
                                        testCase.getId())));
                    } else {
                        Optional<Shape> vendorParamsShapeOptional = model.getShape(vendorParamsShapeIdOptional.get());
                        if (vendorParamsShapeOptional.isPresent()) {
                            Shape vendorParamsShape = vendorParamsShapeOptional.get();
                            NodeValidationVisitor vendorParamsValidator = createVisitor(vendorParamsOptional.get(),
                                    model,
                                    shape,
                                    testCase.getId(),
                                    ".vendorParams");
                            events.addAll(vendorParamsShape.accept(vendorParamsValidator));
                        }

                    }
                } else if (vendorParamsOptional.isPresent()) {
                    events.add(warning(shape,
                            trait,
                            String.format(
                                    "Smoke test case with ID `%s` defined `vendorParams` but no `vendorParamsShape`",
                                    testCase.getId())));
                }

                // Validate input params
                StructureShape input = operationIndex.expectInputShape(shape);
                if (input != null && testCase.getParams().isPresent()) {
                    NodeValidationVisitor paramsValidator = createVisitor(testCase.getParams().get(),
                            model,
                            shape,
                            testCase.getId(),
                            ".params");
                    events.addAll(input.accept(paramsValidator));
                } else if (testCase.getParams().isPresent()) {
                    events.add(error(shape,
                            trait,
                            String.format(
                                    "Smoke test parameters provided for operation with no input: `%s`",
                                    Node.printJson(testCase.getParams().get())

                            )));
                }
            }
        }
        return events;
    }
Validates the following:

<ul>
    <li>vendorParamsShape is a valid shape.</li>
    <li>vendorParams is compatible with vendorParamsShape.</li>
    <li>input is valid for the operation under test.</li>
</ul>
smithy-smoke-test-traits/src/main/java/software/amazon/smithy/smoketests/traits/SmokeTestCaseValidator.java