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)
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