# Pruebas de unidad - Marcadores (c) 2024 Baltasar MIT License <baltasarq@gmail.com>


import unittest


class Marcadores:
    def __init__(self):
        self._marcs = {}
        
    @property
    def num(self):
        return len(self._marcs)
        
    def inserta(self, nombre, url):
        self._marcs[nombre] = url
    
    def get(self, nombre):
        return self._marcs.get(nombre)
        
    def contiene(self, nombre):
        return self.get(nombre) != None
        
    @property
    def nombres(self):
        return self._marcs.keys()
        
    @property
    def todos(self):
        return self._marcs.items()


class TestMarcadores(unittest.TestCase):
    def setUp(self):
        self._marcs = Marcadores()
        self._nombres = ["Google", "Microsoft", "Amazon"]
        self._no_nombres = ["eBay", "Wallapop", "OSNews"]
        self._urls = ["www.google.com", "www.microsoft.com", "www.amazon.com"]
        
    def test_vacio(self):
        self.assertEqual(0, self._marcs.num)
        
    def test_inserta_get(self):
        for i, nombre in enumerate(self._nombres):
            self._marcs.inserta(nombre, self._urls[i])
            
        self.assertEqual(len(self._nombres), self._marcs.num)

        for i, nombre in enumerate(self._nombres):
            self.assertEqual(self._urls[i], self._marcs.get(nombre))
            
        for no_nombre in self._no_nombres:
            self.assertEqual(None, self._marcs.get(no_nombre))
        
    def test_contiene(self):
        for i, nombre in enumerate(self._nombres):
            self._marcs.inserta(nombre, self._urls[i])
            
        self.assertEqual(len(self._nombres), self._marcs.num)
        
        for nombre in self._nombres:
            self.assertTrue(self._marcs.contiene(nombre))
            
        for no_nombre in self._no_nombres:
            self.assertFalse(self._marcs.contiene(no_nombre))

    def test_get_nombres(self):
        for i, nombre in enumerate(self._nombres):
            self._marcs.inserta(nombre, self._urls[i])
            
        self.assertEqual(len(self._nombres), self._marcs.num)
        self.assertEqual(self._nombres, list(self._marcs.nombres))
        
        for i, nombre in enumerate(self._marcs.nombres):
            self.assertEqual(self._marcs.get(nombre), self._urls[i])
            
    def test_get_todos(self):
        for i, nombre in enumerate(self._nombres):
            self._marcs.inserta(nombre, self._urls[i])
            
        self.assertEqual(len(self._nombres), len(self._marcs.todos))
        
        for i, pair in enumerate(self._marcs.todos):
            self.assertEqual(self._urls[i], pair[1])
            self.assertEqual(self._nombres[i], pair[0])


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