Hot-keys on this page

r m x p   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

#! /usr/bin/env python3 

# -*- coding: utf-8 -*- 

 

#       Copyright 2012-2014, Marten de Vries 

# 

#       This file is part of OpenTeacher. 

# 

#       OpenTeacher is free software: you can redistribute it and/or modify 

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

# 

#       OpenTeacher 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 OpenTeacher.  If not, see <http://www.gnu.org/licenses/>. 

 

import unittest 

import glob 

import os 

import contextlib 

 

MODES = ("all", "load") 

 

class TestCase(unittest.TestCase): 

        def setUp(self): 

                self._files = glob.glob(self._mm.resourcePath("testFiles") + "/*") 

 

        def _modsForFile(self, file): 

                #files that aren't loadable that have mods to load them with 

                if os.path.basename(file) in ("netherlands.png", "COPYING",): 

                        return set() 

                #some files' load mods can't be found by the default algorithm 

                #below. They're in the 'endsWith-dict' below. 

                specialCases = [ 

                        #Special case for abbyy since it doesn't have a mimetype 

                        (".xml", set(self._mm.mods("active", type="load", loads={"xml": ["words"]}))), 

                        #same for csv 

                        (".csv", set(self._mm.mods("active", type="load", loads={"csv": ["words"]}))), 

                        #same for sqlite .db 

                        (".db", set(self._mm.mods("active", type="load", loads={"db": ["words"]}))), 

                        #gnuVocabTrain .txt 

                        ("gnuVocabTrain.txt", set(self._mm.mods("active", type="load", format="gnuVocabTrain"))), 

                        #vTrain .txt 

                        ("vtrain.txt", set(self._mm.mods("active", type="load", format="vtrain"))), 

                ] 

                for end, mods in specialCases: 

                        if file.endswith(end): 

                                return mods 

                #the normal algorithm - dissecting the mimetype from the 

                #filename and loading the load module based on that mimetype. 

                mimetype = os.path.basename(file).split(".")[0].replace("_", "/") 

                mods = set(self._mm.mods("active", type="load", mimetype=mimetype)) 

                self.assertTrue(mods, msg="No loader fount for mimetype: %s" % mimetype) 

                return mods 

 

        def _loadFiles(self, results=[]): 

62                if self.mode not in MODES: 

                        self.skipTest("Not running in one of these modes: " + ", ".join(MODES)) 

                        #don't run the tests. 

                        return [] 

                if not results: 

                        #only load when not yet in cache. 

                        for file in self._files: 

                                loadMods = self._modsForFile(file) 

                                for mod in loadMods: 

                                        result = mod.load(file) 

                                        result["file"] = file 

                                        result["mod"] = mod 

                                        results.append(result) 

 

                return results 

 

        def testGetFileTypeOf(self): 

                for file in self._files: 

                        loadMods = self._modsForFile(file) 

                        for mod in loadMods: 

                                try: 

                                        #feel free to extend with new lesson types 

                                        self.assertIn(mod.getFileTypeOf(file), ["words", "topo", "media"]) 

                                except AssertionError: 

                                        print(file, mod) 

                                        raise 

 

        def testHasAttrs(self): 

                for mod in self._mm.mods("active", type="load"): 

                        self.assertTrue(mod.getFileTypeOf) 

                        self.assertTrue(mod.load) 

                        self.assertTrue(mod.name) 

                        for type, ext in mod.loads.items(): 

                                self.assertTrue(type) 

                                self.assertTrue(ext) 

                        with contextlib.suppress(AttributeError): 

                                #optional. But not empty 

                                self.assertTrue(mod.mimetype) 

 

        def testHasItems(self): 

                results = self._loadFiles() 

 

                for data in results: 

                        try: 

                                self.assertTrue(data["list"]["items"]) 

                        except AssertionError: 

                                print(data["mod"], data["file"]) 

                                raise 

 

        def testItemHasUniqueId(self): 

                results = self._loadFiles() 

 

                for data in results: 

                        ids = set() 

                        for item in data["list"]["items"]: 

                                self.assertNotIn(item["id"], ids) 

                                ids.add(item["id"]) 

 

        def testAllEnabled(self): 

                self.assertEqual( 

                        set(self._mm.mods(type="load")), 

                        set(self._mm.mods("active", type="load")) 

                ) 

 

class TestModule: 

        def __init__(self, moduleManager, *args, **kwargs): 

                super().__init__(*args, **kwargs) 

                self._mm = moduleManager 

 

                self.type = "test" 

                self.requires = ( 

                        self._mm.mods(type="load"), 

                ) 

 

        def enable(self): 

                self.TestCase = TestCase 

                self.TestCase._mm = self._mm 

                self.active = True 

 

        def disable(self): 

                self.active = False 

                del self.TestCase 

 

def init(moduleManager): 

        return TestModule(moduleManager)