def test_missing_product_name(self):
        rates = recipe.calculate_required_production_rates(
            [('iron-plate', 100)])

        iron_plate_item, iron_ore_item, = (
            produced_item.required_production_rates_to_produced_items(rates))

        self.assertEqual(iron_plate_item.is_user_requested, True)
        self.assertEqual(iron_plate_item.name, 'iron-plate')
        self.assertEqual(iron_plate_item.username, 'iron-plate')
        self.assertEqual(iron_plate_item.icon,
                         '/appengine/tests/icons/iron-plate.png')
        self.assertIsNone(iron_plate_item.url)
        self.assertEqual(iron_plate_item.required_production_rate, 100)
        self.assertEqual(iron_plate_item.production_machine_username,
                         'Electric furnace')
        # <rate> = <#-machines> * <#-recipe-results> * <machine-speed>
        #          ---------------------------------------------------
        #                        <energy-required>
        # 100 = x * 1 * 2 / 3.5
        # 100 = 4/7x
        # (7/4)100 = x
        # x = 175
        self.assertEqual(iron_plate_item.num_production_machines_required,
                         175)
        self.assertEqual(
            iron_plate_item.production_machine_icon,
            '/appengine/tests/icons/electric-furnace.png')
        self.assertEqual(
            iron_plate_item.production_machine_url,
            'http://www.factorioforums.com/wiki/index.php?title='
            'Electric_furnace')

        self.assertEqual(iron_ore_item.is_user_requested, False)
        self.assertEqual(iron_ore_item.name, 'iron-ore')
    def test_smelting_product(self):
        rates = recipe.calculate_required_production_rates(
            [('copper-plate', 5)])

        copper_plate_item, copper_ore_item = (
            produced_item.required_production_rates_to_produced_items(rates))
        self.assertEqual(copper_plate_item.is_user_requested, True)
        self.assertEqual(copper_plate_item.name, 'copper-plate')
        self.assertEqual(copper_plate_item.username, 'Copper plate')
        self.assertEqual(copper_plate_item.icon,
                         '/appengine/tests/icons/copper-plate.png')
        self.assertEqual(
            copper_plate_item.url,
            'http://www.factorioforums.com/wiki/index.php?title=Copper_plate')
        self.assertEqual(copper_plate_item.required_production_rate, 5)
        self.assertEqual(copper_plate_item.production_machine_username,
                         'Electric furnace')
        # <rate> = <#-machines> * <#-recipe-results> * <machine-speed>
        #          ---------------------------------------------------
        #                        <energy-required>
        # 5 = x * 1 * 2 / 3.5
        # 5 = 4/7x
        # (7/4)5 = x
        # x = 8.75
        self.assertEqual(copper_plate_item.num_production_machines_required, 9)
        self.assertEqual(
            copper_plate_item.production_machine_icon,
            '/appengine/tests/icons/electric-furnace.png')
        self.assertEqual(
            copper_plate_item.production_machine_url,
            'http://www.factorioforums.com/wiki/index.php?title='
            'Electric_furnace')

        self.assertEqual(copper_ore_item.is_user_requested, False)
        self.assertEqual(copper_ore_item.name, 'copper-ore')
 def test_calculate_required_production_rates_overlapping_dependencies(self):
     # 'iron-plate' is used by 'basic-inserter', 'electronic-circuit' and
     # 'iron-gear-wheel'
     required_rates = recipe.calculate_required_production_rates(
         [('basic-inserter', 5)])
     self.assertEqual(
         required_rates,
         [('basic-inserter',
           {'electronic-circuit': 5.0,
            'iron-gear-wheel': 5.0,
            'iron-plate': 5.0},
           {None: 5}),
          ('copper-cable',
           {'copper-plate': 7.5},
           {'electronic-circuit': 15.0}),
          ('copper-ore', {}, {'copper-plate': 7.5}),
          ('copper-plate', {'copper-ore': 7.5}, {'copper-cable': 7.5}),
          ('electronic-circuit',
           {'copper-cable': 15.0, 'iron-plate': 5.0},
           {'basic-inserter': 5.0}),
          ('iron-gear-wheel',
           {'iron-plate': 10.0},
           {'basic-inserter': 5.0}),
          ('iron-ore', {}, {'iron-plate': 20.0}),
          ('iron-plate',
           {'iron-ore': 20.0},
           {'basic-inserter': 5.0,
            'electronic-circuit': 5.0,
            'iron-gear-wheel': 10.0})])
    def test_missing_product_icon(self):
        rates = recipe.calculate_required_production_rates(
            [('iron-ore', 100)])

        iron_ore_item, = (
            produced_item.required_production_rates_to_produced_items(rates))

        self.assertEqual(iron_ore_item.is_user_requested, True)
        self.assertEqual(iron_ore_item.name, 'iron-ore')
        self.assertEqual(iron_ore_item.username, 'Iron ore')
        self.assertEqual(iron_ore_item.icon, '/img/missing-item.png')
        self.assertEqual(
            iron_ore_item.url,
            'http://www.factorioforums.com/wiki/index.php?title=Iron_ore')
        self.assertEqual(iron_ore_item.required_production_rate, 100)
 def test_calculate_required_production_rates(self):
     required_rates = recipe.calculate_required_production_rates(
         [('electronic-circuit', 2)])
     self.assertEqual(
         required_rates,
         [('copper-cable',
           {'copper-plate': 3.0},
           {'electronic-circuit': 6.0}),
          ('copper-ore', {}, {'copper-plate': 3.0}),
          ('copper-plate', {'copper-ore': 3.0}, {'copper-cable': 3.0}),
          ('electronic-circuit',
           {'copper-cable': 6.0, 'iron-plate': 2.0},
           {None: 2}),
          ('iron-ore', {}, {'iron-plate': 2.0}),
          ('iron-plate', {'iron-ore': 2.0}, {'electronic-circuit': 2.0})])
    def test_refined_fluids_have_no_production_machine(self):
        rates = recipe.calculate_required_production_rates(
            [('petroleum-gas', 100)])

        # Should only have one item i.e. 'light-oil-cracking' should not be
        # used to make 'petrolium-gas' from 'light-oil'.
        petrolium_gas_item, = (
            produced_item.required_production_rates_to_produced_items(rates))

        self.assertEqual(petrolium_gas_item.is_user_requested, True)
        self.assertEqual(petrolium_gas_item.name, 'petroleum-gas')
        self.assertEqual(petrolium_gas_item.required_production_rate, 100)
        # All production machine information should be None.
        self.assertIsNone(petrolium_gas_item.production_machine_username)
        self.assertIsNone(petrolium_gas_item.num_production_machines_required)
        self.assertIsNone(petrolium_gas_item.production_machine_icon)
        self.assertIsNone(petrolium_gas_item.production_machine_url)
    def test_base_product(self):
        rates = recipe.calculate_required_production_rates([('copper-ore', 5)])

        copper_ore_item = (
            produced_item.required_production_rates_to_produced_items(rates)[0])
        self.assertEqual(copper_ore_item.is_user_requested, True)
        self.assertEqual(copper_ore_item.name, 'copper-ore')
        self.assertEqual(copper_ore_item.username, 'Copper ore')
        self.assertEqual(copper_ore_item.icon,
                         '/appengine/tests/icons/copper-ore.png')
        self.assertEqual(
            copper_ore_item.url,
            'http://www.factorioforums.com/wiki/index.php?title=Copper_ore')
        self.assertEqual(copper_ore_item.required_production_rate, 5)
        self.assertIsNone(copper_ore_item.production_machine_username)
        self.assertIsNone(copper_ore_item.num_production_machines_required)
        self.assertIsNone(copper_ore_item.production_machine_icon)
        self.assertIsNone(copper_ore_item.production_machine_url)
Example #8
0
    def get(self):
        requirements = []
        for item in self.request.arguments():
            try:
                rate = float(self.request.get(item))
            except ValueError:
                rate = 1.0

            rate = min(MAX_PRODUCTION_RATE, max(MIN_PRODUCTION_RATE, rate))
            requirements.append((item, rate))

        required_production = recipe.calculate_required_production_rates(
            requirements)
        products = produced_item.required_production_rates_to_produced_items(
            required_production)
        template_values = {
            'items_to_produce': get_produceable_items(),
            'products': products,
            'selected_items': get_selected_items(requirements),
        }
        template = JINJA_ENVIRONMENT.get_template('main.html')
        self.response.write(template.render(template_values))
    def test_chemistry_product(self):
        rates = recipe.calculate_required_production_rates(
            [('sulfur', 100)])

        sulfur_item, petrolium_gas_item, water_item = (
            produced_item.required_production_rates_to_produced_items(rates))
        self.assertEqual(sulfur_item.is_user_requested, True)
        self.assertEqual(sulfur_item.name, 'sulfur')
        self.assertEqual(sulfur_item.username, 'Sulfur')
        self.assertEqual(sulfur_item.icon,
                         '/appengine/tests/icons/sulfur.png')
        self.assertEqual(
            sulfur_item.url,
            'http://www.factorioforums.com/wiki/index.php?title=Sulfur')
        self.assertEqual(sulfur_item.required_production_rate, 100)
        self.assertEqual(sulfur_item.production_machine_username,
                         'Chemical plant')
        # <rate> = <#-machines> * <#-recipe-results> * <machine-speed>
        #          ---------------------------------------------------
        #                        <energy-required>
        # 100 = x * 2 * 1.25 / 1
        # 100 = 2.5x
        # 100/2.5 = x
        # x = 40
        self.assertEqual(sulfur_item.num_production_machines_required, 40)
        self.assertEqual(
            sulfur_item.production_machine_icon,
            '/appengine/tests/icons/chemical-plant.png')
        self.assertEqual(
            sulfur_item.production_machine_url,
            'http://www.factorioforums.com/wiki/index.php?title='
            'Chemical_plant')

        self.assertEqual(petrolium_gas_item.is_user_requested, False)
        self.assertEqual(petrolium_gas_item.name, 'petroleum-gas')

        self.assertEqual(water_item.is_user_requested, False)
        self.assertEqual(water_item.name, 'water')
    def test_crafting_product(self):
        rates = recipe.calculate_required_production_rates(
            [('copper-cable', 20)])

        copper_cable_item, copper_plate_item, copper_ore_item = (
            produced_item.required_production_rates_to_produced_items(rates))
        self.assertEqual(copper_cable_item.is_user_requested, True)
        self.assertEqual(copper_cable_item.name, 'copper-cable')
        self.assertEqual(copper_cable_item.username, 'Copper cable')
        self.assertEqual(copper_cable_item.icon,
                         '/appengine/tests/icons/copper-cable.png')
        self.assertEqual(
            copper_cable_item.url,
            'http://www.factorioforums.com/wiki/index.php?title=Copper_cable')
        self.assertEqual(copper_cable_item.required_production_rate, 20)
        self.assertEqual(copper_cable_item.production_machine_username,
                         'Assembling machine 3')
        # <rate> = <#-machines> * <#-recipe-results> * <machine-speed>
        #          ---------------------------------------------------
        #                        <energy-required>
        # 20 = x * 2 * 1.25 / 0.5
        # 20 = 5x
        # 20/5 = x
        # x = 4
        self.assertEqual(copper_cable_item.num_production_machines_required, 4)
        self.assertEqual(
            copper_cable_item.production_machine_icon,
            '/appengine/tests/icons/assembling-machine-3.png')
        self.assertEqual(
            copper_cable_item.production_machine_url,
            'http://www.factorioforums.com/wiki/index.php?title='
            'Assembling_machine_3')

        self.assertEqual(copper_plate_item.is_user_requested, False)
        self.assertEqual(copper_plate_item.name, 'copper-plate')

        self.assertEqual(copper_ore_item.is_user_requested, False)
        self.assertEqual(copper_ore_item.name, 'copper-ore')
    def test_calculate_required_production_rates_complex_chain(self):
        required_rates = recipe.calculate_required_production_rates(
            [('destroyer-capsule', 1)])

        # Calculated from:
        # A) http://www.factorioforums.com/wiki/index.php?title=Destroyer_capsule
        # B) http://www.factorioforums.com/wiki/index.php?title=Plastic_bar
        # C) http://www.factorioforums.com/wiki/index.php?title=Steel_Plate
        self.assertEqual(
            required_rates,
            [('advanced-circuit',
              {'copper-cable': 68.0,
               'electronic-circuit': 34.0,
               'plastic-bar': 34.0},
              {'distractor-capsule': 12.0, 'speed-module': 5.0}),
             ('coal', {}, {'plastic-bar': 17.0}), # B
             ('copper-cable',
              {'copper-plate': 140.5},
              {'advanced-circuit': 68.0, 'electronic-circuit': 213.0}),
             ('copper-ore', {}, {'copper-plate': 220.5}),
             ('copper-plate',
              {'copper-ore': 220.5},
              {'copper-cable': 140.5, 'piercing-bullet-magazine': 80.0}),  # A
             ('defender-capsule',
              {'electronic-circuit': 32.0,
               'iron-gear-wheel': 48.0,
               'piercing-bullet-magazine': 16.0},
              {'distractor-capsule': 16.0}),
             ('destroyer-capsule',
              {'distractor-capsule': 4.0, 'speed-module': 1.0},
              {None: 1}),
             ('distractor-capsule',
              {'advanced-circuit': 12.0, 'defender-capsule': 16.0},
              {'destroyer-capsule': 4.0}),
             ('electronic-circuit',
              {'copper-cable': 213.0, 'iron-plate': 71.0},
              {'advanced-circuit': 34.0,
               'defender-capsule': 32.0,
               'speed-module': 5.0}),
             ('iron-gear-wheel',
              {'iron-plate': 96.0},
              {'defender-capsule': 48.0}),
             ('iron-ore', {}, {'iron-plate': 247.0}),
             ('iron-plate',
              {'iron-ore': 247.0},
              {'electronic-circuit': 71.0,  # A
               'iron-gear-wheel': 96.0,     # A
               'steel-plate': 80.0}),       # C
             ('petroleum-gas', {}, {'plastic-bar': 51.0}),  # B
             ('piercing-bullet-magazine',
              {'copper-plate': 80.0, 'steel-plate': 16.0},
              {'defender-capsule': 16.0}),
             ('plastic-bar',
              {'coal': 17.0, 'petroleum-gas': 51.0},
              {'advanced-circuit': 34.0}),  # A
             ('speed-module',
              {'advanced-circuit': 5.0, 'electronic-circuit': 5.0},
              {'destroyer-capsule': 1.0}),  # A
             ('steel-plate',
              {'iron-plate': 80.0},
              {'piercing-bullet-magazine': 16.0})])  # A