# Copyright 2018 The Bazel Authors. All rights reserved.
#
# Licensed 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.
"""Unit tests for types.bzl."""

load("//lib:types.bzl", "types")
load("//lib:unittest.bzl", "asserts", "unittest")

def _a_function():
    """A dummy function for testing."""
    pass

def _is_string_test(ctx):
    """Unit tests for types.is_string."""

    env = unittest.begin(ctx)

    asserts.true(env, types.is_string(""))
    asserts.true(env, types.is_string("string"))

    asserts.false(env, types.is_string(4))
    asserts.false(env, types.is_string([1]))
    asserts.false(env, types.is_string({}))
    asserts.false(env, types.is_string(()))
    asserts.false(env, types.is_string(True))
    asserts.false(env, types.is_string(None))
    asserts.false(env, types.is_string(_a_function))

    unittest.end(env)

is_string_test = unittest.make(_is_string_test)

def _is_bool_test(ctx):
    """Unit tests for types.is_bool."""

    env = unittest.begin(ctx)

    asserts.true(env, types.is_bool(True))
    asserts.true(env, types.is_bool(False))

    asserts.false(env, types.is_bool(4))
    asserts.false(env, types.is_bool([1]))
    asserts.false(env, types.is_bool({}))
    asserts.false(env, types.is_bool(()))
    asserts.false(env, types.is_bool(""))
    asserts.false(env, types.is_bool(None))
    asserts.false(env, types.is_bool(_a_function))

    unittest.end(env)

is_bool_test = unittest.make(_is_bool_test)

def _is_list_test(ctx):
    """Unit tests for types.is_list."""

    env = unittest.begin(ctx)

    asserts.true(env, types.is_list([]))
    asserts.true(env, types.is_list([1]))

    asserts.false(env, types.is_list(4))
    asserts.false(env, types.is_list("s"))
    asserts.false(env, types.is_list({}))
    asserts.false(env, types.is_list(()))
    asserts.false(env, types.is_list(True))
    asserts.false(env, types.is_list(None))
    asserts.false(env, types.is_list(_a_function))

    unittest.end(env)

is_list_test = unittest.make(_is_list_test)

def _is_none_test(ctx):
    """Unit tests for types.is_none."""

    env = unittest.begin(ctx)

    asserts.true(env, types.is_none(None))

    asserts.false(env, types.is_none(4))
    asserts.false(env, types.is_none("s"))
    asserts.false(env, types.is_none({}))
    asserts.false(env, types.is_none(()))
    asserts.false(env, types.is_none(True))
    asserts.false(env, types.is_none([]))
    asserts.false(env, types.is_none([1]))
    asserts.false(env, types.is_none(_a_function))

    unittest.end(env)

is_none_test = unittest.make(_is_none_test)

def _is_int_test(ctx):
    """Unit tests for types.is_int."""

    env = unittest.begin(ctx)

    asserts.true(env, types.is_int(1))
    asserts.true(env, types.is_int(-1))

    asserts.false(env, types.is_int("s"))
    asserts.false(env, types.is_int({}))
    asserts.false(env, types.is_int(()))
    asserts.false(env, types.is_int(True))
    asserts.false(env, types.is_int([]))
    asserts.false(env, types.is_int([1]))
    asserts.false(env, types.is_int(None))
    asserts.false(env, types.is_int(_a_function))

    unittest.end(env)

is_int_test = unittest.make(_is_int_test)

def _is_tuple_test(ctx):
    """Unit tests for types.is_tuple."""

    env = unittest.begin(ctx)

    asserts.true(env, types.is_tuple(()))
    asserts.true(env, types.is_tuple((1,)))

    asserts.false(env, types.is_tuple(1))
    asserts.false(env, types.is_tuple("s"))
    asserts.false(env, types.is_tuple({}))
    asserts.false(env, types.is_tuple(True))
    asserts.false(env, types.is_tuple([]))
    asserts.false(env, types.is_tuple([1]))
    asserts.false(env, types.is_tuple(None))
    asserts.false(env, types.is_tuple(_a_function))

    unittest.end(env)

is_tuple_test = unittest.make(_is_tuple_test)

def _is_dict_test(ctx):
    """Unit tests for types.is_dict."""

    env = unittest.begin(ctx)

    asserts.true(env, types.is_dict({}))
    asserts.true(env, types.is_dict({"key": "value"}))

    asserts.false(env, types.is_dict(1))
    asserts.false(env, types.is_dict("s"))
    asserts.false(env, types.is_dict(()))
    asserts.false(env, types.is_dict(True))
    asserts.false(env, types.is_dict([]))
    asserts.false(env, types.is_dict([1]))
    asserts.false(env, types.is_dict(None))
    asserts.false(env, types.is_dict(_a_function))

    unittest.end(env)

is_dict_test = unittest.make(_is_dict_test)

def _is_function_test(ctx):
    """Unit tests for types.is_dict."""

    env = unittest.begin(ctx)

    asserts.true(env, types.is_function(_a_function))

    asserts.false(env, types.is_function({}))
    asserts.false(env, types.is_function(1))
    asserts.false(env, types.is_function("s"))
    asserts.false(env, types.is_function(()))
    asserts.false(env, types.is_function(True))
    asserts.false(env, types.is_function([]))
    asserts.false(env, types.is_function([1]))
    asserts.false(env, types.is_function(None))

    unittest.end(env)

is_function_test = unittest.make(_is_function_test)

def types_test_suite():
    """Creates the test targets and test suite for types.bzl tests."""
    unittest.suite(
        "types_tests",
        is_list_test,
        is_string_test,
        is_bool_test,
        is_none_test,
        is_int_test,
        is_tuple_test,
        is_dict_test,
        is_function_test,
    )
