Example #1
0
class TestInventoryAllocator(unittest.TestCase):
    def setUp(self):
        self.allocator = InventoryAllocator()

    def test_empty_order_empty_storage(self):
        self.assertEqual(self.allocator.allocate({}, []), [])

    def test_empty_order(self):
        order = {}
        storage = [{"name": "a", "inventory": {"apple": 5}}]
        self.assertEqual(self.allocator.allocate(order, storage), [])

        order = {"apple": 0}
        self.assertEqual(self.allocator.allocate(order, storage), [])

    def test_empty_storage(self):
        order = {"apple": 1}
        storage = []
        self.assertEqual(self.allocator.allocate(order, storage), [])

        storage = [{"name": "a", "inventory": {"apple": 0}}]
        self.assertEqual(self.allocator.allocate(order, storage), [])

    def test_exact_match(self):
        order = {"apple": 2, "orange": 1}
        storage = [{"name": "owd", "inventory": {"apple": 2, "orange": 1}}]
        self.assertEqual(self.allocator.allocate(order, storage), [{
            "owd": {
                "apple": 2,
                "orange": 1
            }
        }])

    def test_not_enough_inventory(self):
        order = {"apple": 2}
        storage = [{"name": "a", "inventory": {"apple": 0}}]
        self.assertEqual(self.allocator.allocate(order, storage), [])

        order = {"apple": 3}
        storage = [{
            "name": "a",
            "inventory": {
                "grape": 2
            }
        }, {
            "name": "b",
            "inventory": {
                "orange": 2
            }
        }]
        self.assertEqual(self.allocator.allocate(order, storage), [])

        order = {"apple": 3, "orange": 2}
        storage = [{
            "name": "a",
            "inventory": {
                "apple": 1,
                "orange": 1
            }
        }, {
            "name": "b",
            "inventory": {
                "apple": 1,
                "orange": 1
            }
        }]
        self.assertEqual(self.allocator.allocate(order, storage), [])

    def test_split_enough_inventory(self):
        order = {"apple": 5, "orange": 5}
        storage = [{
            "name": "a",
            "inventory": {
                "apple": 1,
                "orange": 5
            }
        }, {
            "name": "b",
            "inventory": {
                "apple": 6,
                "orange": 2
            }
        }]
        self.assertEqual(self.allocator.allocate(order, storage), [{
            "a": {
                "apple": 1,
                "orange": 5
            }
        }, {
            "b": {
                "apple": 4
            }
        }])
class InventoryAllocatorTest(unittest.TestCase):
    def setUp(self):
        self.invAlc = InventoryAllocator()

    def test_happy_case(self):
        print('\nTest: test_happy_case')
        order = {'apple': 1}
        inventory_dist = [{'name': 'owd', 'inventory': {'apple': 1}}]
        expected = [{'owd': {'apple': 1}}]
        self.assertEqual(self.invAlc.allocate(order, inventory_dist), expected)
        print('Passed!')

    def test_not_enough_inventory(self):
        print('\nTest: test_not_enough_inventory')
        order = {'apple': 10}
        inventory_dist = [{'name': 'owd', 'inventory': {'apple': 5}}]
        expected = []
        self.assertEqual(self.invAlc.allocate(order, inventory_dist), expected)
        print('Passed!')

    def test_multi_not_enough_inventory(self):
        print('\nTest: test_multi_not_enough_inventory')
        order = {'apple': 10, 'banana': 5}
        inventory_dist = [{
            'name': 'owd',
            'inventory': {
                'apple': 10,
                'banana': 2
            }
        }]
        expected = []
        self.assertEqual(self.invAlc.allocate(order, inventory_dist), expected)
        print('Passed!')

    def test_split_even(self):
        print('\nTest: test_split_even')
        order = {'apple': 10}
        inventory_dist = [{
            'name': 'owd',
            'inventory': {
                'apple': 5
            }
        }, {
            'name': 'dm',
            'inventory': {
                'apple': 5
            }
        }]
        expected = [{'owd': {'apple': 5}}, {'dm': {'apple': 5}}]
        self.assertEqual(self.invAlc.allocate(order, inventory_dist), expected)
        print('Passed!')

    def test_split_odd(self):
        print('\nTest: test_split_odd')
        order = {'apple': 10}
        inventory_dist = [{
            'name': 'owd',
            'inventory': {
                'apple': 7
            }
        }, {
            'name': 'dm',
            'inventory': {
                'apple': 3
            }
        }]
        expected = [{'owd': {'apple': 7}}, {'dm': {'apple': 3}}]
        self.assertEqual(self.invAlc.allocate(order, inventory_dist), expected)
        print('Passed!')

    def test_multi_split_even(self):
        print('\nTest: test_multi_split_even')
        order = {'apple': 10, 'banana': 6}
        inventory_dist = [{
            'name': 'owd',
            'inventory': {
                'apple': 5,
                'banana': 3
            }
        }, {
            'name': 'dm',
            'inventory': {
                'apple': 5,
                'banana': 3
            }
        }]
        expected = [{
            'owd': {
                'apple': 5,
                'banana': 3
            }
        }, {
            'dm': {
                'apple': 5,
                'banana': 3
            }
        }]
        self.assertEqual(self.invAlc.allocate(order, inventory_dist), expected)
        print('Passed!')

    def test_multi_split_odd(self):
        print('\nTest: test_multi_split_odd')
        order = {'apple': 10, 'banana': 6}
        inventory_dist = [{
            'name': 'owd',
            'inventory': {
                'apple': 5,
                'banana': 2
            }
        }, {
            'name': 'dm',
            'inventory': {
                'apple': 5,
                'banana': 4
            }
        }]
        expected = [{
            'owd': {
                'apple': 5,
                'banana': 2
            }
        }, {
            'dm': {
                'apple': 5,
                'banana': 4
            }
        }]
        self.assertEqual(self.invAlc.allocate(order, inventory_dist), expected)
        print('Passed!')

    def test_split_more_than_needed(self):
        print('\nTest: test_split_more_than_needed')
        order = {'apple': 10}
        inventory_dist = [{
            'name': 'owd',
            'inventory': {
                'apple': 7
            }
        }, {
            'name': 'dm',
            'inventory': {
                'apple': 5
            }
        }]
        expected = [{'owd': {'apple': 7}}, {'dm': {'apple': 3}}]
        self.assertEqual(self.invAlc.allocate(order, inventory_dist), expected)
        print('Passed!')

    def test_tricky(self):
        print('\nTest: test_tricky')
        order = {
            'apple': 10,
            'banana': 3,
            'orange': 4,
            'mango': 5,
            'carrot': 6,
        }
        store1 = {'name': 'owd', 'inventory': {'mango': 3, 'apple': 5}}  # 7
        store2 = {'name': 'dm', 'inventory': {'carrot': 7, 'apple': 3}}  # 10
        store3 = {
            'name': 'bp',
            'inventory': {
                'banana': 1,
                'mango': 2,
                'orange': 3
            }
        }  # 6
        store4 = {
            'name': 'lo',
            'inventory': {
                'apple': 4,
                'banana': 1,
                'orange': 1
            }
        }  # 6
        store5 = {
            'name': 'aw',
            'inventory': {
                'banana': 1,
                'carrot': 1,
                'orange': 1
            }
        }  # 3

        inventory_dist = [store5, store4, store3, store1, store2]
        expected = [{
            'aw': {
                'banana': 1,
                'carrot': 1,
                'orange': 1
            }
        }, {
            'lo': {
                'apple': 4,
                'banana': 1,
                'orange': 1
            }
        }, {
            'bp': {
                'mango': 2,
                'banana': 1,
                'orange': 2
            }
        }, {
            'dm': {
                'carrot': 5,
                'apple': 1
            }
        }, {
            'owd': {
                'apple': 5,
                'mango': 3
            }
        }]
        self.assertCountEqual(self.invAlc.allocate(order, inventory_dist),
                              expected)
        print('Passed!')

    def test_food_not_in_one_store(self):
        print('\nTest: test_food_not_in_one_store')
        order = {'apple': 5, 'banana': 10}
        store1 = {'name': 'owd', 'inventory': {'mango': 2, 'grapes': 2}}
        store2 = {'name': 'dm', 'inventory': {'banana': 12, 'radish': 2}}
        inventory_dist = [store1, store2]
        expected = []
        self.assertEqual(self.invAlc.allocate(order, inventory_dist), expected)
        print('Passed!')

    def test_food_not_in_all_store(self):
        print('\nTest: test_food_not_in_all_store')
        order = {'apple': 5, 'pear': 10}
        store1 = {'name': 'owd', 'inventory': {'mango': 2, 'grapes': 2}}
        store2 = {'name': 'dm', 'inventory': {'banana': 12, 'radish': 2}}
        inventory_dist = [store1, store2]
        expected = []
        self.assertEqual(self.invAlc.allocate(order, inventory_dist), expected)
        print('Passed!')

    def test_food_inventory_zero(self):
        print('\nTest: test_food_inventory_zero')
        order = {'apple': 5, 'pear': 10}
        store1 = {'name': 'owd', 'inventory': {'apple': 0, 'pear': 0}}
        store2 = {'name': 'dm', 'inventory': {'banana': 0, 'radish': 0}}
        inventory_dist = [store1, store2]
        expected = []
        self.assertEqual(self.invAlc.allocate(order, inventory_dist), expected)
        print('Passed!')

    def test_no_stores(self):
        print('\nTest: test_no_stores')
        order = {'apple': 5, 'pear': 10}
        inventory_dist = []
        expected = []
        self.assertEqual(self.invAlc.allocate(order, inventory_dist), expected)
        print('Passed!')

    def test_no_order(self):
        print('\nTest: test_no_order')
        order = []
        inventory_dist = [{
            'name': 'dm',
            'inventory': {
                'banana': 0,
                'radish': 0
            }
        }]
        expected = []
        self.assertEqual(self.invAlc.allocate(order, inventory_dist), expected)
        print('Passed!')

    def test_no_order_or_store(self):
        print('\nTest: test_no_order_or_store')
        order = []
        inventory_dist = []
        expected = []
        self.assertEqual(self.invAlc.allocate(order, inventory_dist), expected)
        print('Passed!')