from check_index import *

def check_objects(o):
    assert is_list(o)
    assert len(o) == 1
    check_index_object(o[0], "cache", 2, 0, check_object_cache)

def check_cache_entry(actual, expected):
    assert is_dict(actual)
    assert sorted(actual.keys()) == ["name", "properties", "type", "value"]

    assert is_string(actual["type"], expected["type"])
    assert is_string(actual["value"], expected["value"])

    def check_property(actual, expected):
        assert is_dict(actual)
        assert sorted(actual.keys()) == ["name", "value"]
        assert is_string(actual["value"], expected["value"])

    check_list_match(lambda a, e: is_string(a["name"], e["name"]), actual["properties"], expected["properties"], check=check_property)

def check_object_cache(o):
    assert sorted(o.keys()) == ["entries", "kind", "version"]
    # The "kind" and "version" members are handled by check_index_object.
    check_list_match(lambda a, e: is_string(a["name"], e["name"]), o["entries"], [
        {
            "name": "CM_OPTION_BOOL",
            "type": "BOOL",
            "value": "OFF",
            "properties": [
                {
                    "name": "HELPSTRING",
                    "value": "Testing option()",
                },
            ],
        },
        {
            "name": "CM_SET_BOOL",
            "type": "BOOL",
            "value": "ON",
            "properties": [
                {
                    "name": "HELPSTRING",
                    "value": "Testing set(CACHE BOOL)",
                },
                {
                    "name": "ADVANCED",
                    "value": "1",
                },
            ],
        },
        {
            "name": "CM_SET_FILEPATH",
            "type": "FILEPATH",
            "value": "dir1/dir2/empty.txt",
            "properties": [
                {
                    "name": "HELPSTRING",
                    "value": "Testing set(CACHE FILEPATH)",
                },
            ],
        },
        {
            "name": "CM_SET_PATH",
            "type": "PATH",
            "value": "dir1/dir2",
            "properties": [
                {
                    "name": "HELPSTRING",
                    "value": "Testing set(CACHE PATH)",
                },
                {
                    "name": "ADVANCED",
                    "value": "ON",
                },
            ],
        },
        {
            "name": "CM_SET_STRING",
            "type": "STRING",
            "value": "test",
            "properties": [
                {
                    "name": "HELPSTRING",
                    "value": "Testing set(CACHE STRING)",
                },
            ],
        },
        {
            "name": "CM_SET_STRINGS",
            "type": "STRING",
            "value": "1",
            "properties": [
                {
                    "name": "HELPSTRING",
                    "value": "Testing set(CACHE STRING) with STRINGS",
                },
                {
                    "name": "STRINGS",
                    "value": "1;2;3;4",
                },
            ],
        },
        {
            "name": "CM_SET_INTERNAL",
            "type": "INTERNAL",
            "value": "int2",
            "properties": [
                {
                    "name": "HELPSTRING",
                    "value": "Testing set(CACHE INTERNAL)",
                },
            ],
        },
        {
            "name": "CM_SET_TYPE",
            "type": "STRING",
            "value": "1",
            "properties": [
                {
                    "name": "HELPSTRING",
                    "value": "Testing set(CACHE INTERNAL) with set_property(TYPE)",
                },
                {
                    "name": "ADVANCED",
                    "value": "0",
                },
            ],
        },
    ], check=check_cache_entry, allow_extra=True)

assert is_dict(index)
assert sorted(index.keys()) == ["cmake", "objects", "reply"]
check_objects(index["objects"])