# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.

import pytest

from pyfory import Fory


@pytest.mark.parametrize("xlang", [False, True])
def test_root_header_rejects_reserved_bits(xlang):
    fory = Fory(xlang=xlang)
    data = bytearray(fory.serialize(1))
    data[0] |= 0x04

    with pytest.raises(ValueError, match="Unsupported root header bitmap"):
        fory.deserialize(bytes(data))


@pytest.mark.parametrize("xlang", [False, True])
def test_root_header_rejects_xlang_mismatch(xlang):
    fory = Fory(xlang=xlang)
    data = bytearray(fory.serialize(1))
    data[0] ^= 0x01

    with pytest.raises(ValueError, match="xlang bit"):
        fory.deserialize(bytes(data))


@pytest.mark.parametrize("xlang", [False, True])
def test_root_header_oob_flag_requires_buffers(xlang):
    fory = Fory(xlang=xlang)
    data = bytearray(fory.serialize(1))
    data[0] |= 0x02

    with pytest.raises(ValueError, match="Out-of-band buffers are required"):
        fory.deserialize(bytes(data))


@pytest.mark.parametrize("xlang", [False, True])
def test_root_header_rejects_buffers_without_oob_flag(xlang):
    fory = Fory(xlang=xlang)
    data = fory.serialize(1)

    with pytest.raises(ValueError, match="Out-of-band buffers were provided"):
        fory.deserialize(data, buffers=[])
