from __future__ import print_function, division, absolute_import
from fontTools.varLib.builder import buildVarData
import pytest


@pytest.mark.parametrize("region_indices, items, expected_num_shorts", [
    ([], [], 0),
    ([0], [[1]], 0),
    ([0], [[128]], 1),
    ([0, 1, 2], [[128, 1, 2], [3, -129, 5], [6, 7, 8]], 2),
    ([0, 1, 2], [[0, 128, 2], [3, 4, 5], [6, 7, -129]], 3),
], ids=[
    "0_regions_0_deltas",
    "1_region_1_uint8",
    "1_region_1_short",
    "3_regions_2_shorts_ordered",
    "3_regions_2_shorts_unordered",
])
def test_buildVarData_no_optimize(region_indices, items, expected_num_shorts):
    data = buildVarData(region_indices, items, optimize=False)

    assert data.ItemCount == len(items)
    assert data.NumShorts == expected_num_shorts
    assert data.VarRegionCount == len(region_indices)
    assert data.VarRegionIndex == region_indices
    assert data.Item == items


@pytest.mark.parametrize([
    "region_indices", "items", "expected_num_shorts",
    "expected_regions", "expected_items"
], [
    ([0, 1, 2], [[0, 1, 2], [3, 4, 5], [6, 7, 8]], 0,
     [0, 1, 2], [[0, 1, 2], [3, 4, 5], [6, 7, 8]]),
    ([0, 1, 2], [[0, 128, 2], [3, 4, 5], [6, 7, 8]], 1,
     [1, 0, 2], [[128, 0, 2], [4, 3, 5], [7, 6, 8]]),
    ([0, 1, 2], [[0, 1, 128], [3, 4, 5], [6, -129, 8]], 2,
     [1, 2, 0], [[1, 128, 0], [4, 5, 3], [-129, 8, 6]]),
    ([0, 1, 2], [[128, 1, -129], [3, 4, 5], [6, 7, 8]], 2,
     [0, 2, 1], [[128, -129, 1], [3, 5, 4], [6, 8, 7]]),
    ([0, 1, 2], [[0, 1, 128], [3, -129, 5], [256, 7, 8]], 3,
     [0, 1, 2], [[0, 1, 128], [3, -129, 5], [256, 7, 8]]),
    ([0, 1, 2], [[0, 128, 2], [0, 4, 5], [0, 7, 8]], 1,
     [1, 2], [[128, 2], [4, 5], [7, 8]]),
], ids=[
    "0/3_shorts_no_reorder",
    "1/3_shorts_reorder",
    "2/3_shorts_reorder",
    "2/3_shorts_same_row_reorder",
    "3/3_shorts_no_reorder",
    "1/3_shorts_1/3_zeroes",
])
def test_buildVarData_optimize(
        region_indices, items, expected_num_shorts, expected_regions,
        expected_items):
    data = buildVarData(region_indices, items, optimize=True)

    assert data.ItemCount == len(items)
    assert data.NumShorts == expected_num_shorts
    assert data.VarRegionCount == len(expected_regions)
    assert data.VarRegionIndex == expected_regions
    assert data.Item == expected_items


if __name__ == "__main__":
    import sys
    sys.exit(pytest.main(sys.argv))
