# ____________________________________________________________________________________
#
# Pyomo: Python Optimization Modeling Objects
# Copyright (c) 2008-2026 National Technology and Engineering Solutions of Sandia, LLC
# Under the terms of Contract DE-NA0003525 with National Technology and Engineering
# Solutions of Sandia, LLC, the U.S. Government retains certain rights in this
# software.  This software is distributed under the 3-clause BSD License.
# ____________________________________________________________________________________
#
# Unit Tests for util/misc
#

import os
from os.path import abspath, dirname

pyomodir = dirname(abspath(__file__)) + "/../.."
currdir = dirname(abspath(__file__)) + os.sep

import pyomo.common.unittest as unittest

from pyomo.common.tempfiles import TempfileManager
import pyomo.opt
import pyomo.opt.plugins.sol
from pyomo.opt.base.solvers import UnknownSolver

old_tempdir = TempfileManager.tempdir


class MockWriter(pyomo.opt.AbstractProblemWriter):
    def __init__(self, name=None):
        pyomo.opt.AbstractProblemWriter.__init__(self, name)


class MockReader(pyomo.opt.AbstractResultsReader):
    def __init__(self, name=None):
        pyomo.opt.AbstractResultsReader.__init__(self, name)


class MockSolver(pyomo.opt.OptSolver):
    def __init__(self, **kwds):
        kwds['type'] = 'stest_type'
        kwds['doc'] = 'MockSolver Documentation'
        pyomo.opt.OptSolver.__init__(self, **kwds)


class Test(unittest.TestCase):
    @classmethod
    def setUpClass(cls):
        import pyomo.environ

    def run(self, result=None):
        unittest.TestCase.run(self, result)

    def setUp(self):
        pyomo.opt.WriterFactory.register('wtest')(MockWriter)
        pyomo.opt.ReaderFactory.register('rtest')(MockReader)
        pyomo.opt.SolverFactory.register('stest')(MockSolver)
        TempfileManager.tempdir = currdir

    def tearDown(self):
        TempfileManager.clear_tempfiles()
        TempfileManager.tempdir = old_tempdir
        pyomo.opt.WriterFactory.unregister('wtest')
        pyomo.opt.ReaderFactory.unregister('rtest')
        pyomo.opt.SolverFactory.unregister('stest')

    def test_solver_factory(self):
        # """
        # Testing the pyomo.opt solver factory
        # """
        ans = sorted(list(pyomo.opt.SolverFactory))
        # self.assertEqual(len(ans),8)
        self.assertTrue(set(['stest']) <= set(ans))

    def test_solver_instance(self):
        # """
        # Testing that we get a specific solver instance
        # """
        ans = pyomo.opt.SolverFactory("none")
        self.assertTrue(isinstance(ans, UnknownSolver))
        ans = pyomo.opt.SolverFactory("stest")
        self.assertEqual(type(ans), MockSolver)
        ans = pyomo.opt.SolverFactory("stest", name="mymock")
        self.assertEqual(type(ans), MockSolver)
        self.assertEqual(ans.name, "mymock")

    def test_writer_factory(self):
        # """
        # Testing the pyomo.opt writer factory
        # """
        factory = pyomo.opt.WriterFactory
        self.assertTrue(set(['wtest']) <= set(factory))

    def test_writer_instance(self):
        # """
        # Testing that we get a specific writer instance
        #
        # Note: this simply provides code coverage right now, but
        # later it should be adapted to generate a specific writer.
        # """
        ans = pyomo.opt.WriterFactory("none")
        self.assertEqual(ans, None)
        ans = pyomo.opt.WriterFactory("wtest")
        self.assertNotEqual(ans, None)

    def test_reader_factory(self):
        # """
        # Testing the pyomo.opt reader factory
        # """
        ans = pyomo.opt.ReaderFactory
        self.assertTrue(set(ans) >= set(["rtest", "sol", "yaml", "json"]))

    def test_reader_instance(self):
        # """
        # Testing that we get a specific reader instance
        # """
        ans = pyomo.opt.ReaderFactory("none")
        self.assertEqual(ans, None)
        ans = pyomo.opt.ReaderFactory("sol")
        self.assertEqual(type(ans), pyomo.opt.plugins.sol.ResultsReader_sol)
        # ans = pyomo.opt.ReaderFactory("osrl", "myreader")
        # self.assertEqual(type(ans), pyomo.opt.reader.OS.ResultsReader_osrl)
        # self.assertEqual(ans.name, "myreader")


if __name__ == "__main__":
    unittest.main()
