test_utils.py 2.98 KB
Newer Older
1
# SPDX-License-Identifier: Apache-2.0
2
# SPDX-FileCopyrightText: Copyright contributors to the vLLM project
3
4
5

import pytest

6
from vllm.v1.structured_output.backend_xgrammar import (
7
8
    has_xgrammar_unsupported_json_features,
)
9

10
11
pytestmark = pytest.mark.cpu_test

12
13
14
15

@pytest.fixture
def unsupported_string_schemas():
    return [
16
        {"type": "string", "format": "non_existing_format"},
17
18
19
20
21
22
    ]


@pytest.fixture
def unsupported_integer_schemas():
    return [
23
        {"type": "integer", "multipleOf": 120},
24
25
26
27
28
29
    ]


@pytest.fixture
def unsupported_number_schemas():
    return [
30
        {"type": "number", "multipleOf": 120},
31
32
33
34
35
36
    ]


@pytest.fixture
def unsupported_array_schemas():
    return [
37
38
39
40
        {"type": "array", "uniqueItems": True},
        {"type": "array", "contains": {"type": "string"}},
        {"type": "array", "minContains": 1},
        {"type": "array", "maxContains": 5},
41
42
43
44
45
46
    ]


@pytest.fixture
def unsupported_object_schemas():
    return [
47
48
49
50
        {"type": "object", "minProperties": 1},
        {"type": "object", "maxProperties": 5},
        {"type": "object", "propertyNames": {"pattern": "^[a-z]+$"}},
        {"type": "object", "patternProperties": {"^S": {"type": "string"}}},
51
52
53
54
55
56
57
58
    ]


@pytest.fixture
def supported_schema():
    return {
        "type": "object",
        "properties": {
59
60
            "name": {"type": "string"},
            "age": {"type": "integer"},
61
            "email": {"type": "string", "format": "email"},
62
63
64
65
66
67
            "status": {"type": "string"},
            "scores": {"type": "array", "items": {"type": "number"}},
            "car_type": {"type": "string", "enum": ["sedan", "suv", "truck"]},
            "car_brand": {"type": "string", "pattern": "^[a-zA-Z]+$"},
            "short_description": {"type": "string", "maxLength": 50},
            "mileage": {"type": "number", "minimum": 0, "maximum": 1000000},
68
69
70
            "model_year": {
                "type": "integer",
                "exclusiveMinimum": 1900,
71
                "exclusiveMaximum": 2100,
72
            },
73
            "long_description": {"type": "string", "minLength": 50, "maxLength": 2000},
74
75
76
            "address": {
                "type": "object",
                "properties": {
77
78
79
80
81
                    "street": {"type": "string"},
                    "city": {"type": "string"},
                },
            },
        },
82
83
84
    }


85
86
87
88
89
90
91
92
93
94
@pytest.mark.parametrize(
    "schema_type",
    [
        "unsupported_string_schemas",
        "unsupported_integer_schemas",
        "unsupported_number_schemas",
        "unsupported_array_schemas",
        "unsupported_object_schemas",
    ],
)
95
96
97
def test_unsupported_json_features_by_type(schema_type, request):
    schemas = request.getfixturevalue(schema_type)
    for schema in schemas:
98
99
100
        assert has_xgrammar_unsupported_json_features(schema), (
            f"Schema should be unsupported: {schema}"
        )
101
102
103


def test_supported_json_features(supported_schema):
104
105
106
    assert not has_xgrammar_unsupported_json_features(supported_schema), (
        "Schema should be supported"
    )