-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbomreader_test.py
More file actions
109 lines (87 loc) · 3.81 KB
/
bomreader_test.py
File metadata and controls
109 lines (87 loc) · 3.81 KB
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
"""Unit tests for the BOMReader class.
Author:
Dan Haggerty (daniel.r.haggerty@gmail.com)
Date:
Jan. 11th, 2018
TODO:
It's more readable if the test data isn't in different files, but
in rather in this file.
Usage:
python bomreader_test.py
"""
import bomreader
import unittest
class TestBomReader(unittest.TestCase):
"""Unit tests for TestBomReader.
Reads a few BOM files, tests results of bomreader.BOMReader.read()
and bomreader.BOMReader.get_top_n_parts()
"""
def test_get_top_n_parts_is_correct(self):
"""get_top_n_parts() should return correct data.
Results should be sorted by NumOccurrence and ties should go to
the part with the higher count of ReferenceDesignators.
"""
bom_reader = bomreader.BOMReader('test_files/example.bom')
top_n_parts = bom_reader.get_top_n_parts()
expected = [
{
'MPN': '40001',
'Manufacturer': 'Keystone',
'ReferenceDesignators': ['Z1', 'Z3', 'Z8'],
'NumOccurrences': 2
},
{
'MPN': 'AXXX-1000',
'Manufacturer': 'Panasonic',
'ReferenceDesignators': ['D1', 'D8', 'D9'],
'NumOccurrences': 1
}
]
self.assertEqual(expected, top_n_parts)
def test_get_top_n_parts_raises_with_empty_bom(self):
"""get_top_n_parts() should raise if nothing's been read yet."""
bom_reader = bomreader.BOMReader()
with self.assertRaises(bomreader.BOMNotInstantiatedError):
bom_reader.get_top_n_parts()
def test_read_called_again_clears_original_bom(self):
"""read() should clear everything between calls."""
bom_reader = bomreader.BOMReader('test_files/example.bom')
top_n_parts_before = bom_reader.get_top_n_parts()
bom_reader.read('test_files/example2.bom')
top_n_parts_after = bom_reader.get_top_n_parts()
expected_part = {
'MPN': 'AXXX-1000',
'Manufacturer': 'Panasonic',
'ReferenceDesignators': ['D1', 'D8', 'D9'],
'NumOccurrences': 1
}
self.assertIn(expected_part, top_n_parts_before)
self.assertNotIn(expected_part, top_n_parts_after)
def test_read_raises_with_higher_n_than_num_parts(self):
"""read() raises BOMReadError if n is too big."""
with self.assertRaises(bomreader.BOMReadError):
bomreader.BOMReader('test_files/n_too_high.bom')
def test_read_raises_with_unexpected_line_format(self):
"""Unexpected format of BOM file line should raise."""
with self.assertRaises(bomreader.BOMReadError):
bomreader.BOMReader('test_files/unexpected_format.bom')
def test_parse_line_parses_format_1(self):
"""Lines that fit format 1 should be parsed."""
bom_line = 'AXXX-1000:Panasonic:D1,D8,D9'
expected = ('Panasonic', 'AXXX-1000', set(['D1', 'D8', 'D9']))
result = bomreader.parse_line(bom_line)
self.assertEqual(expected, result)
def test_parse_line_parses_format_2(self):
"""Lines that fit format 2 should be parsed."""
bom_line = 'Wintermute Systems -- CASE-19201:A2,A3'
expected = ('Wintermute Systems', 'CASE-19201', set(['A2', 'A3']))
result = bomreader.parse_line(bom_line)
self.assertEqual(expected, result)
def test_parse_line_parses_format_3(self):
"""Lines that fit format 3 should be parsed."""
bom_line = 'Z1,Z3;40001;Keystone'
expected = ('Keystone', '40001', set(['Z1', 'Z3']))
result = bomreader.parse_line(bom_line)
self.assertEqual(expected, result)
if __name__ == '__main__':
unittest.main()