# 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.

"""Unit tests for factory.py."""

from chromite.lib import cros_test_lib
from chromite.lib import factory
from chromite.utils import memoize


def _GET_OBJECT():
    return object()


class FactoryTest(cros_test_lib.TestCase):
    """Test that ObjectFactory behaves as expected."""

    _OBJECT_NAME = "Test Object Name"
    _OBJECT_TYPES = {
        "t0": _GET_OBJECT,
        "t1": memoize.Memoize(_GET_OBJECT),
        "t3": memoize.Memoize(_GET_OBJECT),
        "t4": None,
    }

    def _allowed_transitions(self, from_setup, to_setup):
        return from_setup == "t3" and to_setup == "t4"

    def setUp(self) -> None:
        self.of = factory.ObjectFactory(self._OBJECT_NAME, self._OBJECT_TYPES)
        self.of2 = factory.ObjectFactory(
            self._OBJECT_NAME, self._OBJECT_TYPES, self._allowed_transitions
        )

    def testGetInstance(self) -> None:
        self.of.Setup("t0")
        a = self.of.GetInstance()
        self.assertNotEqual(a, self.of.GetInstance())

    def testGetCachedInstance(self) -> None:
        self.of.Setup("t1")
        a = self.of.GetInstance()
        self.assertEqual(a, self.of.GetInstance())

    def testDuplicateSetupForbidden(self) -> None:
        self.of.Setup("t0")
        with self.assertRaises(factory.ObjectFactoryIllegalOperation):
            self.of.Setup("t0")

    def testNotSetup(self) -> None:
        with self.assertRaises(factory.ObjectFactoryIllegalOperation):
            self.of.GetInstance()

    def testUnknownSetupForbidden(self) -> None:
        with self.assertRaises(factory.ObjectFactoryIllegalOperation):
            self.of.Setup("unknown setup type")

    def testSetupWithInstanceForbidden(self) -> None:
        with self.assertRaises(factory.ObjectFactoryIllegalOperation):
            self.of.Setup("t0", None)

    def testSetupWithInstanceAllowed(self) -> None:
        self.of.Setup("t4", None)

    def testForbiddenTransition(self) -> None:
        self.of2.Setup("t0")
        with self.assertRaises(factory.ObjectFactoryIllegalOperation):
            self.of2.Setup("t1")

    def testAllowedTransition(self) -> None:
        self.of2.Setup("t3")
        a = self.of2.GetInstance()
        self.of2.Setup("t4", None)
        self.assertNotEqual(a, self.of2.GetInstance())
