Upload files to ''
This commit is contained in:
		
							
								
								
									
										186
									
								
								test_huffman.py
									
									
									
									
									
								
							
							
						
						
									
										186
									
								
								test_huffman.py
									
									
									
									
									
								
							@@ -1,122 +1,140 @@
 | 
				
			|||||||
import unittest
 | 
					#
 | 
				
			||||||
from src.Sommets import *
 | 
					#     Sam Hadow - Huffman-py
 | 
				
			||||||
from src.Arbre import *
 | 
					#     Copyright (C) 2023
 | 
				
			||||||
from src.fonctions.encode import *
 | 
					#
 | 
				
			||||||
from src.fonctions.decode import *
 | 
					#     This program is free software: you can redistribute it and/or modify
 | 
				
			||||||
from src.fonctions.occurence import *
 | 
					#     it under the terms of the GNU General Public License as published by
 | 
				
			||||||
 | 
					#     the Free Software Foundation, either version 3 of the License, or
 | 
				
			||||||
 | 
					#     (at your option) any later version.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#     This program is distributed in the hope that it will be useful,
 | 
				
			||||||
 | 
					#     but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
				
			||||||
 | 
					#     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
				
			||||||
 | 
					#     GNU General Public License for more details.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					#     You should have received a copy of the GNU General Public License
 | 
				
			||||||
 | 
					#     along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# pour lancer les tests utilisez:
 | 
					import unittest
 | 
				
			||||||
 | 
					from huffman_py.Node import *
 | 
				
			||||||
 | 
					from huffman_py.Tree import *
 | 
				
			||||||
 | 
					from huffman_py.functions.encode import *
 | 
				
			||||||
 | 
					from huffman_py.functions.decode import *
 | 
				
			||||||
 | 
					from huffman_py.functions.occurence import *
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Tu run unit tests:
 | 
				
			||||||
# python -m unittest discover
 | 
					# python -m unittest discover
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class TestUtils(unittest.TestCase):
 | 
					class TestUtils(unittest.TestCase):
 | 
				
			||||||
    def test_Arbre_id(self):
 | 
					    def test_Tree_id(self):
 | 
				
			||||||
        a = Sommets(10, 'a')
 | 
					        a = Node(10, 'a')
 | 
				
			||||||
        b = Sommets(8,'b')
 | 
					        b = Node(8,'b')
 | 
				
			||||||
        r1 = Sommets(18,'',left=b,right=a)
 | 
					        r1 = Node(18,'',left=b,right=a)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        arbre1 = Arbre(r1)
 | 
					        tree1 = Tree(r1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # vérification affectation d'un identifiant unique en créant l'arbre
 | 
					        # unique identifier check
 | 
				
			||||||
        liste_id = []
 | 
					        id_list = []
 | 
				
			||||||
        verification_id = True
 | 
					        check_id = True
 | 
				
			||||||
        for elem in arbre1.sommets:
 | 
					        for elem in tree1.nodes:
 | 
				
			||||||
            liste_id.append(elem.identifiant)
 | 
					            id_list.append(elem.identifier)
 | 
				
			||||||
        if len(liste_id) > len(set(liste_id)):
 | 
					        if len(id_list) > len(set(id_list)):
 | 
				
			||||||
            verification_id  = False
 | 
					            check_id  = False
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self.assertTrue(verification_id)
 | 
					        self.assertTrue(check_id)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_Arbre_fusion(self):
 | 
					    def test_Tree_fusion(self):
 | 
				
			||||||
        # fusion des arbres
 | 
					        # tree merge
 | 
				
			||||||
        # on doit retrouver les éléments des 2 arbres + une nouvelle racine
 | 
					        # we must find elements in initial trees + a root
 | 
				
			||||||
        # les identifiants doivent toujours être uniques
 | 
					        # identifiers must be unique
 | 
				
			||||||
        a = Sommets(10, 'a')
 | 
					        a = Node(10, 'a')
 | 
				
			||||||
        b = Sommets(8,'b')
 | 
					        b = Node(8,'b')
 | 
				
			||||||
        r1 = Sommets(18,'',left=b,right=a)
 | 
					        r1 = Node(18,'',left=b,right=a)
 | 
				
			||||||
        c = Sommets(15, 'c')
 | 
					        c = Node(15, 'c')
 | 
				
			||||||
        d = Sommets(20,'d')
 | 
					        d = Node(20,'d')
 | 
				
			||||||
        r2 = Sommets(18,'',left=d,right=c)
 | 
					        r2 = Node(18,'',left=d,right=c)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        arbre1 = Arbre(r1)
 | 
					        tree1 = Tree(r1)
 | 
				
			||||||
        arbre2 = Arbre(r2)
 | 
					        tree2 = Tree(r2)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        l1 = len(arbre1.sommets)
 | 
					        l1 = len(tree1.nodes)
 | 
				
			||||||
        l2 = len(arbre2.sommets)
 | 
					        l2 = len(tree2.nodes)
 | 
				
			||||||
        arbre1 += arbre2
 | 
					        tree1 += tree2
 | 
				
			||||||
        verification_fusion = True
 | 
					        check_fusion = True
 | 
				
			||||||
        if l1+l2+1 != len(arbre1.sommets):
 | 
					        if l1+l2+1 != len(tree1.nodes):
 | 
				
			||||||
            verification_fusion = False
 | 
					            check_fusion = False
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        liste_id2 = []
 | 
					        id_list2 = []
 | 
				
			||||||
        verification_id2 = True
 | 
					        check_id2 = True
 | 
				
			||||||
        for elem in arbre1.sommets:
 | 
					        for elem in tree1.nodes:
 | 
				
			||||||
            liste_id2.append(elem.identifiant)
 | 
					            id_list2.append(elem.identifier)
 | 
				
			||||||
        if len(liste_id2) > len(set(liste_id2)):
 | 
					        if len(id_list2) > len(set(id_list2)):
 | 
				
			||||||
            verification_id2  = False
 | 
					            check_id2  = False
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self.assertTrue(verification_fusion)
 | 
					        self.assertTrue(check_fusion)
 | 
				
			||||||
        self.assertTrue(verification_id2)
 | 
					        self.assertTrue(check_id2)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_Arbre_recherche(self):
 | 
					    def test_Tree_seek(self):
 | 
				
			||||||
        # recherche de sommet
 | 
					        # seek a node
 | 
				
			||||||
        a = Sommets(10, 'a')
 | 
					        a = Node(10, 'a')
 | 
				
			||||||
        b = Sommets(8,'b')
 | 
					        b = Node(8,'b')
 | 
				
			||||||
        r1 = Sommets(18,'',left=b,right=a)
 | 
					        r1 = Node(18,'',left=b,right=a)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        arbre1 = Arbre(r1)
 | 
					        tree1 = Tree(r1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self.assertEqual(arbre1.recherche(a),a)
 | 
					        self.assertEqual(tree1.seek(a),a)
 | 
				
			||||||
        self.assertNotEqual(arbre1.recherche(b),a)
 | 
					        self.assertNotEqual(tree1.seek(b),a)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_Arbre_suppression(self):
 | 
					    def test_Tree_delete(self):
 | 
				
			||||||
        a = Sommets(10, 'a')
 | 
					        a = Node(10, 'a')
 | 
				
			||||||
        b = Sommets(8,'b')
 | 
					        b = Node(8,'b')
 | 
				
			||||||
        r1 = Sommets(18,'',left=b,right=a)
 | 
					        r1 = Node(18,'',left=b,right=a)
 | 
				
			||||||
        r2 = Sommets(18,'',left=None,right=r1)
 | 
					        r2 = Node(18,'',left=None,right=r1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        arbre1 = Arbre(r2)
 | 
					        tree1 = Tree(r2)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        arbre1 -= r1
 | 
					        tree1 -= r1
 | 
				
			||||||
        self.assertEqual(arbre1.recherche(a),None)
 | 
					        self.assertEqual(tree1.seek(a),None)
 | 
				
			||||||
        self.assertEqual(arbre1.recherche(b),None)
 | 
					        self.assertEqual(tree1.seek(b),None)
 | 
				
			||||||
        self.assertEqual(arbre1.recherche(r1),None)
 | 
					        self.assertEqual(tree1.seek(r1),None)
 | 
				
			||||||
        self.assertEqual(arbre1.recherche(r2),r2)
 | 
					        self.assertEqual(tree1.seek(r2),r2)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_occurences(self):
 | 
					    def test_occurences(self):
 | 
				
			||||||
        o1 = calcul_occurence('aaabcc')
 | 
					        o1 = calcul_occurence('aaabcc')
 | 
				
			||||||
        o2 = calcul_occurence('bacaac')
 | 
					        o2 = calcul_occurence('bacaac')
 | 
				
			||||||
        # dans les 2 cas on doit avoir le même dictionnaire
 | 
					        # Same dictionary in both case
 | 
				
			||||||
        # 3 pour a, 2 pour c, 1 pour b
 | 
					        # 3 for a, 2 for c, 1 for b
 | 
				
			||||||
        self.assertEqual(o1,o2)
 | 
					        self.assertEqual(o1,o2)
 | 
				
			||||||
        self.assertEqual(o1['c'],2)
 | 
					        self.assertEqual(o1['c'],2)
 | 
				
			||||||
        self.assertEqual(o1['b'],1)
 | 
					        self.assertEqual(o1['b'],1)
 | 
				
			||||||
        self.assertEqual(o1['a'],3)
 | 
					        self.assertEqual(o1['a'],3)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_encodage_huffman(self):
 | 
					    def test_huffman_encode(self):
 | 
				
			||||||
        string = 'mouton'
 | 
					        string = 'sheep'
 | 
				
			||||||
        string2 = 'vache'
 | 
					        string2 = 'cow'
 | 
				
			||||||
        (encodedOutput, racine, huffmanEncoding) = huffman_encode(string)
 | 
					        (encodedOutput, root, huffmanEncoding) = huffman_encode(string)
 | 
				
			||||||
        (encodedOutput2, racine2, huffmanEncoding2) = huffman_encode(string2)
 | 
					        (encodedOutput2, root2, huffmanEncoding2) = huffman_encode(string2)
 | 
				
			||||||
        # l'encodage doit être différent (les dictionnaires et arbres aussi)
 | 
					        # encoding must be different
 | 
				
			||||||
        self.assertNotEqual(huffmanEncoding, huffmanEncoding2)
 | 
					        self.assertNotEqual(huffmanEncoding, huffmanEncoding2)
 | 
				
			||||||
        self.assertNotEqual(encodedOutput, encodedOutput2)
 | 
					        self.assertNotEqual(encodedOutput, encodedOutput2)
 | 
				
			||||||
        self.assertNotEqual(Arbre(racine),Arbre(racine2))
 | 
					        self.assertNotEqual(Tree(root),Tree(root2))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def test_decodage_huffman(self):
 | 
					    def test_decodage_huffman(self):
 | 
				
			||||||
        string = 'chèvre'
 | 
					        string = 'chicken'
 | 
				
			||||||
        (encodedOutput, racine, huffmanEncoding) = huffman_encode(string)
 | 
					        (encodedOutput, root, huffmanEncoding) = huffman_encode(string)
 | 
				
			||||||
        # on doit être capable de décoder avec la racine de l'arbre ou avec le dictionnaire
 | 
					        # We must be able to decode a binary from its tree root/dict
 | 
				
			||||||
        self.assertEqual(string,huffman_decode(encodedOutput,racine))
 | 
					        self.assertEqual(string,huffman_decode(encodedOutput,root))
 | 
				
			||||||
        self.assertEqual(string,decode_from_dico(encodedOutput,huffmanEncoding))
 | 
					        self.assertEqual(string,decode_from_dict(encodedOutput,huffmanEncoding))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # on doit être capable de détecter si le dictionnaire/arbre n'est  pas celui correspondant à un texte encodé
 | 
					        # we must be able to detect if tree/dict isn't the correct one to decode a binary
 | 
				
			||||||
        string2 = 'poule'
 | 
					        string2 = 'pig'
 | 
				
			||||||
        (encodedOutput2, racine2, huffmanEncoding2) = huffman_encode(string2)
 | 
					        (encodedOutput2, root2, huffmanEncoding2) = huffman_encode(string2)
 | 
				
			||||||
        with self.assertRaises(ValueError):
 | 
					        with self.assertRaises(ValueError):
 | 
				
			||||||
            decode_from_dico(encodedOutput2,huffmanEncoding)
 | 
					            decode_from_dict(encodedOutput2,huffmanEncoding)
 | 
				
			||||||
        with self.assertRaises(ValueError):
 | 
					        with self.assertRaises(ValueError):
 | 
				
			||||||
            huffman_decode(encodedOutput2,racine)
 | 
					            huffman_decode(encodedOutput2,root)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if __name__ == '__main__':
 | 
					if __name__ == '__main__':
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user