197 lines
4.2 KiB
Python
197 lines
4.2 KiB
Python
# SPDX-License-Identifier: Apache-2.0
|
|
|
|
import pytest
|
|
|
|
from vllm.v1.structured_output.backend_xgrammar import (
|
|
has_xgrammar_unsupported_json_features)
|
|
|
|
|
|
@pytest.fixture
|
|
def unsupported_string_schemas():
|
|
return [
|
|
{
|
|
"type": "string",
|
|
"pattern": "^[a-zA-Z]+$"
|
|
},
|
|
{
|
|
"type": "string",
|
|
"format": "email"
|
|
},
|
|
]
|
|
|
|
|
|
@pytest.fixture
|
|
def unsupported_integer_schemas():
|
|
return [
|
|
{
|
|
"type": "integer",
|
|
"minimum": 0
|
|
},
|
|
{
|
|
"type": "integer",
|
|
"maximum": 120
|
|
},
|
|
{
|
|
"type": "integer",
|
|
"exclusiveMinimum": 120
|
|
},
|
|
{
|
|
"type": "integer",
|
|
"exclusiveMaximum": 120
|
|
},
|
|
{
|
|
"type": "integer",
|
|
"multipleOf": 120
|
|
},
|
|
]
|
|
|
|
|
|
@pytest.fixture
|
|
def unsupported_number_schemas():
|
|
return [
|
|
{
|
|
"type": "number",
|
|
"minimum": 0
|
|
},
|
|
{
|
|
"type": "number",
|
|
"maximum": 120
|
|
},
|
|
{
|
|
"type": "number",
|
|
"exclusiveMinimum": 120
|
|
},
|
|
{
|
|
"type": "number",
|
|
"exclusiveMaximum": 120
|
|
},
|
|
{
|
|
"type": "number",
|
|
"multipleOf": 120
|
|
},
|
|
]
|
|
|
|
|
|
@pytest.fixture
|
|
def unsupported_array_schemas():
|
|
return [
|
|
{
|
|
"type": "array",
|
|
"uniqueItems": True
|
|
},
|
|
{
|
|
"type": "array",
|
|
"contains": {
|
|
"type": "string"
|
|
}
|
|
},
|
|
{
|
|
"type": "array",
|
|
"minContains": 1
|
|
},
|
|
{
|
|
"type": "array",
|
|
"maxContains": 5
|
|
},
|
|
{
|
|
"type": "array",
|
|
"minItems": 1
|
|
},
|
|
{
|
|
"type": "array",
|
|
"maxItems": 10
|
|
},
|
|
]
|
|
|
|
|
|
@pytest.fixture
|
|
def unsupported_object_schemas():
|
|
return [
|
|
{
|
|
"type": "object",
|
|
"minProperties": 1
|
|
},
|
|
{
|
|
"type": "object",
|
|
"maxProperties": 5
|
|
},
|
|
{
|
|
"type": "object",
|
|
"propertyNames": {
|
|
"pattern": "^[a-z]+$"
|
|
}
|
|
},
|
|
{
|
|
"type": "object",
|
|
"patternProperties": {
|
|
"^S": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
},
|
|
]
|
|
|
|
|
|
@pytest.fixture
|
|
def supported_schema():
|
|
return {
|
|
"type": "object",
|
|
"properties": {
|
|
"name": {
|
|
"type": "string"
|
|
},
|
|
"age": {
|
|
"type": "integer"
|
|
},
|
|
"status": {
|
|
"type": "string"
|
|
},
|
|
"scores": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "number"
|
|
}
|
|
},
|
|
"car_type": {
|
|
"type": "string",
|
|
"enum": ["sedan", "suv", "truck"]
|
|
},
|
|
"short_description": {
|
|
"type": "string",
|
|
"maxLength": 50
|
|
},
|
|
"long_description": {
|
|
"type": "string",
|
|
"minLength": 50
|
|
},
|
|
"address": {
|
|
"type": "object",
|
|
"properties": {
|
|
"street": {
|
|
"type": "string"
|
|
},
|
|
"city": {
|
|
"type": "string"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@pytest.mark.parametrize("schema_type", [
|
|
"unsupported_string_schemas", "unsupported_integer_schemas",
|
|
"unsupported_number_schemas", "unsupported_array_schemas",
|
|
"unsupported_object_schemas"
|
|
])
|
|
def test_unsupported_json_features_by_type(schema_type, request):
|
|
schemas = request.getfixturevalue(schema_type)
|
|
for schema in schemas:
|
|
assert has_xgrammar_unsupported_json_features(
|
|
schema), f"Schema should be unsupported: {schema}"
|
|
|
|
|
|
def test_supported_json_features(supported_schema):
|
|
assert not has_xgrammar_unsupported_json_features(
|
|
supported_schema), "Schema should be supported"
|