test_utils.py 2.94 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
        {"type": "object", "propertyNames": {"pattern": "^[a-z]+$"}},
        {"type": "object", "patternProperties": {"^S": {"type": "string"}}},
49
50
51
52
53
54
55
56
    ]


@pytest.fixture
def supported_schema():
    return {
        "type": "object",
        "properties": {
57
58
            "name": {"type": "string"},
            "age": {"type": "integer"},
59
            "email": {"type": "string", "format": "email"},
60
61
62
63
64
65
            "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},
66
67
68
            "model_year": {
                "type": "integer",
                "exclusiveMinimum": 1900,
69
                "exclusiveMaximum": 2100,
70
            },
71
            "long_description": {"type": "string", "minLength": 50, "maxLength": 2000},
72
73
74
            "address": {
                "type": "object",
                "properties": {
75
76
77
78
79
                    "street": {"type": "string"},
                    "city": {"type": "string"},
                },
            },
        },
80
81
        "minProperties": 1,
        "maxProperties": 100,
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"
    )