# Copyright 2015 The ChromiumOS Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Tests for json_lib."""

from chromite.lib import cros_test_lib
from chromite.lib import json_lib
from chromite.lib import osutils


class JsonHelpersTest(cros_test_lib.MockTestCase):
    """Tests for chromite.lib.json_lib."""

    def testAssertIsInstance(self):
        """Test that AssertIsInstance is correct."""
        self.assertRaises(
            ValueError, json_lib.AssertIsInstance, tuple(), list, "a bad value"
        )
        self.assertRaises(
            ValueError, json_lib.AssertIsInstance, 1, float, "a bad value"
        )
        self.assertRaises(
            ValueError, json_lib.AssertIsInstance, 1, bool, "a bad value"
        )
        json_lib.AssertIsInstance([1], list, "good value")
        json_lib.AssertIsInstance(True, bool, "good value")
        json_lib.AssertIsInstance({"foo": 2}, dict, "good value")

    def testGetValueOfType(self):
        """Test that GetValueOfType is correct."""
        self.assertRaises(
            ValueError,
            json_lib.GetValueOfType,
            {},
            "missing key",
            str,
            "missing value",
        )
        self.assertRaises(
            ValueError,
            json_lib.GetValueOfType,
            {"key": 1},
            "key",
            bool,
            "bad type",
        )
        self.assertRaises(
            ValueError,
            json_lib.GetValueOfType,
            {"key": [1]},
            "key",
            int,
            "bad type",
        )
        self.assertEqual(
            json_lib.GetValueOfType({"key": 1}, "key", int, "good value"), 1
        )

    def testPopValueOfType(self):
        """Test that PopValueOfType is correct."""
        input_dict = {"key": "value"}
        self.assertEqual(
            "value", json_lib.GetValueOfType(input_dict, "key", str, "value")
        )
        self.assertEqual(
            "value", json_lib.PopValueOfType(input_dict, "key", str, "value")
        )
        self.assertFalse(input_dict)

    def testParseJsonFileWithComments(self):
        """Test that we can parse a JSON file with comments."""
        JSON_WITH_COMMENTS = """
        {
        # I am a comment.
        "foo": [],
        "# I am not": "a # comment"
        }
        """
        self.PatchObject(osutils, "ReadFile", return_value=JSON_WITH_COMMENTS)
        self.assertEqual(
            {
                "foo": [],
                "# I am not": "a # comment",
            },
            json_lib.ParseJsonFileWithComments("fake path"),
        )
        self.PatchObject(osutils, "ReadFile", return_value="")
        self.assertRaises(
            ValueError, json_lib.ParseJsonFileWithComments, "fake path"
        )

    def testGetNestedDictValue(self):
        """Test that GetNestedDictValue is correct."""
        NESTED_DICT = {
            "lv1.1": {"lv2.1": {"value": "1.1"}, "lv2.2": {"value": "1.2"}},
            "lv1.2": {"lv2.1": {"value": "2.1"}, "lv2.2": {"value": "2.2"}},
        }
        self.assertEqual(
            "1.1",
            json_lib.GetNestedDictValue(
                NESTED_DICT, ["lv1.1", "lv2.1", "value"]
            ),
        )
        self.assertEqual(
            "2.1",
            json_lib.GetNestedDictValue(
                NESTED_DICT, ["lv1.2", "lv2.1", "value"]
            ),
        )
        # level 2 key missing
        self.assertIsNone(
            json_lib.GetNestedDictValue(
                NESTED_DICT, ["lv1.1", "lv2.3", "value"]
            )
        )
        # level 1 key missing
        self.assertIsNone(
            json_lib.GetNestedDictValue(
                NESTED_DICT, ["lv1.3", "lv2.1", "value"]
            )
        )
        # no level 3 key
        self.assertIsNone(
            json_lib.GetNestedDictValue(
                NESTED_DICT, ["lv1.1", "lv2.1", "lv3", "value"]
            )
        )

        # no level 4
        self.assertIsNone(
            json_lib.GetNestedDictValue(
                NESTED_DICT, ["lv1.1", "lv2.1", "value", "1.1"]
            )
        )
