def setUp(self): self._data_provider = MagicMock() self._lineage = {"archetype": "SomeArchetype", "family": "SomeFamily"} self._class_name = "SomeClass" self._tree_name = "SomeTree" self._tree_type = "TreeType" self._tree_y_subclass = "" self._spell_effect_formatter = MagicMock() self._coord_mapper = MagicMock() self._logger = MagicMock() self.sut = AAFactory(self._data_provider, self._spell_effect_formatter, self._coord_mapper, self._logger) self._coord_mapper.map_coords.side_effect = lambda x, y: x
class TestAAFactory(unittest.TestCase): def setUp(self): self._data_provider = MagicMock() self._lineage = {"archetype": "SomeArchetype", "family": "SomeFamily"} self._class_name = "SomeClass" self._tree_name = "SomeTree" self._tree_type = "TreeType" self._tree_y_subclass = "" self._spell_effect_formatter = MagicMock() self._coord_mapper = MagicMock() self._logger = MagicMock() self.sut = AAFactory(self._data_provider, self._spell_effect_formatter, self._coord_mapper, self._logger) self._coord_mapper.map_coords.side_effect = lambda x, y: x def _setup_spells(self, expected_crc, returned_spells): def _mock_spells(crc): if crc == expected_crc: return { "spell_list": returned_spells } self._data_provider.spells.side_effect = _mock_spells def test_create_maps_basic_properties(self): aa_node = AABuilder().build() result = self.sut.create(aa_node, self._lineage, self._class_name, self._tree_name, self._tree_y_subclass) self.assertEqual(result.id, 0) self.assertEqual(result.soe_id, aa_node["nodeid"]) self.assertEqual(result.parent_ids, []) self.assertEqual(result.name, aa_node["name"]) self.assertEqual(result.description, aa_node["description"]) self.assertEqual(result.title, aa_node["title"]) self.assertEqual(result.subclass, aa_node["classification"]) self.assertEqual(result.max_level, aa_node["maxtier"]) self.assertEqual(result.coords, [aa_node["xcoord"], aa_node["ycoord"]]) self.assertEqual(result.level, 0) self.assertEqual(result.cost, aa_node["pointspertier"]) self.assertEqual(result.children, []) def test_create_fetches_effects_in_order(self): aa_node = AABuilder().spellcrc(123).build() spell_rank5 = SpellBuilder().with_crc(123).rank(5).add_effect('Rank5', 1).build() spell_rank1 = SpellBuilder().with_crc(123).rank(1).add_effect('Rank1', 1).build() self._setup_spells(123, [spell_rank5, spell_rank1]) self._spell_effect_formatter.format.side_effect = lambda effects: effects[0]["description"] + "Formatted" result = self.sut.create(aa_node, self._lineage, self._class_name, self._tree_name, self._tree_y_subclass) self.assertEqual(result.effects, ["Rank1Formatted", "Rank5Formatted"]) def test_create_sets_icon_ids(self): aa_node = AABuilder().spellcrc(123).build() spell = SpellBuilder().with_crc(123).backdrop(50).icon(100).build() self._setup_spells(123, [spell]) result = self.sut.create(aa_node, self._lineage, self._class_name, self._tree_name, self._tree_y_subclass) self.assertDictEqual(result.icon, { "icon": 100, "backdrop": 50 }) def test_create_sets_parent(self): aa_node = AABuilder().parent_ids([5]).build() result = self.sut.create(aa_node, self._lineage, self._class_name, self._tree_name, self._tree_y_subclass) self.assertEqual(result.parent_ids, [aa_node["firstparentid"]]) def test_create_sets_prereqs(self): aa_node = AABuilder().requires_global_points(1)\ .requires_parent_points(2)\ .requires_subtree_points(3)\ .requires_tree_points(4)\ .build() result = self.sut.create(aa_node, self._lineage, self._class_name, self._tree_name, self._tree_y_subclass) expected_prereqs = { "parent_subtree": 0, "global": 1, "tree": 4, "subtree": 3, "parent": 2} self.assertDictEqual(result.prereqs, expected_prereqs) def test_create_shadows_subclass_matches_lineage_archetype_sets_parent_subtree_prereq(self): self._tree_name = "Shadows" aa_node = AABuilder().subclass(self._lineage["archetype"]).build() result = self.sut.create(aa_node, self._lineage, self._class_name, self._tree_name, self._tree_y_subclass) self.assertEqual(result.prereqs["parent_subtree"], 10) def test_create_shadows_subclass_matches_lineage_family_sets_parent_subtree_prereq(self): self._tree_name = "Shadows" aa_node = AABuilder().subclass(self._lineage["family"]).build() result = self.sut.create(aa_node, self._lineage, self._class_name, self._tree_name, self._tree_y_subclass) self.assertEqual(result.prereqs["parent_subtree"], 10) def test_create_shadows_subclass_matches_class_name_sets_parent_subtree_prereq(self): self._tree_name = "Shadows" aa_node = AABuilder().subclass(self._class_name).build() result = self.sut.create(aa_node, self._lineage, self._class_name, self._tree_name, self._tree_y_subclass) self.assertEqual(result.prereqs["parent_subtree"], 10) def test_create_parent_subtree_prereqs_ignored_if_not_shadows_tree(self): self._tree_name = "NonShadowsTree" aa_node = AABuilder().subclass(self._lineage["family"]).build() result = self.sut.create(aa_node, self._lineage, self._class_name, self._tree_name, self._tree_y_subclass) self.assertEqual(result.prereqs["parent_subtree"], 0) def test_create_parent_subtree_prereqs_ignored_if_subclass_prereq_present(self): self._tree_name = "Shadows" aa_node = AABuilder().subclass(self._lineage["family"]).requires_subtree_points(10).build() result = self.sut.create(aa_node, self._lineage, self._class_name, self._tree_name, self._tree_y_subclass) self.assertEqual(result.prereqs["parent_subtree"], 0) def test_create_subtree_prereq_created_if_subclass_matches_y_classifcation(self): self._tree_y_subclass = "YSubclass" aa_node = AABuilder().subclass("YSubclass").cost(3).build() result = self.sut.create(aa_node, self._lineage, self._class_name, self._tree_name, self._tree_y_subclass) self.assertEqual(result.prereqs["subtree"], 3) def test_create_all_replaces_parent_soe_ids(self): aa_nodes = [AABuilder().with_id(50).build(), AABuilder().with_id(60).parent_ids([50]).build(), AABuilder().with_id(70).parent_ids([60]).build(), AABuilder().with_id(80).build()] aa, orphans, subtrees = self.sut.create_all(aa_nodes, self._lineage, self._class_name, self._tree_name, self._tree_type, self._tree_y_subclass) self.assertEqual(list(map(lambda n: n.parent_ids, aa)), [[], [0], [1], []]) def test_create_populates_children(self): aa_nodes = [AABuilder().with_id(50).build(), AABuilder().with_id(60).parent_ids([50]).build(), AABuilder().with_id(70).parent_ids([50]).build(), AABuilder().with_id(80).parent_ids([60]).build(), AABuilder().with_id(90).parent_ids([60]).build(), AABuilder().with_id(100).build()] aa, orphans, subtrees = self.sut.create_all(aa_nodes, self._lineage, self._class_name, self._tree_name, self._tree_type, self._tree_y_subclass) self.assertEqual(list(map(lambda n: n.children, aa)), [[1, 2], [3, 4], [], [], [], []]) def test_create_sorts_aa_top_to_bottom_left_to_right(self): aa_nodes = [AABuilder().with_id(50).coords(1, 1).build(), AABuilder().with_id(60).coords(0, 0).build(), AABuilder().with_id(70).coords(1, 0).build(), AABuilder().with_id(80).coords(0, 1).build()] aa, orphans, subtrees = self.sut.create_all(aa_nodes, self._lineage, self._class_name, self._tree_name, self._tree_type, self._tree_y_subclass) self.assertEquals(list(map(lambda a: a.coords, aa)), [[0, 0], [1, 0], [0, 1], [1, 1]]) def test_create_reorders_aa_by_sorted_order(self): aa_nodes = [AABuilder().with_id(50).coords(1, 1).build(), AABuilder().with_id(60).coords(0, 0).build(), AABuilder().with_id(70).coords(1, 0).build(), AABuilder().with_id(80).coords(0, 1).build()] aa, orphans, subtrees = self.sut.create_all(aa_nodes, self._lineage, self._class_name, self._tree_name, self._tree_type, self._tree_y_subclass) self.assertEquals(list(map(lambda a: a.id, aa)), [0, 1, 2, 3]) def test_create_sets_orphans_to_aa_with_no_parents(self): aa_nodes = [AABuilder().with_id(5).build(), AABuilder().with_id(6).build(), AABuilder().with_id(7).parent_ids([5]).build()] aa, orphans, subtrees = self.sut.create_all(aa_nodes, self._lineage, self._class_name, self._tree_name, self._tree_type, self._tree_y_subclass) self.assertEqual(orphans, [0, 1]) def test_create_sets_subtrees_to_distinct_aa_subclasses(self): aa_nodes = [AABuilder().subclass("Subclass1").build(), AABuilder().subclass("Subclass1").build(), AABuilder().subclass("Subclass2").build()] aa, orphans, subtrees = self.sut.create_all(aa_nodes, self._lineage, self._class_name, self._tree_name, self._tree_type, self._tree_y_subclass) self.assertEqual(subtrees, { 'Subclass1': 0, 'Subclass2': 0 }) def test_create_sets_multiple_parents(self): aa_nodes = [AABuilder().with_id(0).build(), AABuilder().with_id(1).build(), AABuilder().with_id(2).parent_ids([0, 1]).build()] aa, orphans, subtrees = self.sut.create_all(aa_nodes, self._lineage, self._class_name, self._tree_name, self._tree_type, self._tree_y_subclass) self.assertEqual(aa[2].parent_ids, [0, 1])
def run(self): start_time = datetime.datetime.now() logger = ConsoleLogger() logger.log('Started') cache_dir_path = os.path.abspath('./soe/cached_data') logger.log('Cache path: ' + cache_dir_path) data_provider = CachedDataProvider(SonyDataProvider(UrlReader(logger)), FileDataCache(cache_dir_path)) spell_effect_formatter = SpellEffectFormatter() coord_mapper = AACoordMapper() aa_factory = AAFactory(data_provider, spell_effect_formatter, coord_mapper, logger) tree_factory = TreeFactory(data_provider, aa_factory, logger) point_pool_factory = PointPoolFactory() class_factory = EQ2ClassFactory(data_provider, tree_factory, point_pool_factory, logger) json_writer = JsonFileWriter(logger) build_dir = os.path.abspath('../../build') icon_output_path = os.path.join(build_dir, 'icons') self._ensure_dir_exists(icon_output_path) icon_downloader = IconDownloader(data_provider, icon_output_path, logger) image_manipulator = ImageManipulator() sprite_output_path = os.path.join(build_dir, 'sprites') self._ensure_dir_exists(sprite_output_path) sprite_image_generator = SpriteImageGenerator(image_manipulator, icon_output_path, sprite_output_path, logger) classes = list(class_factory.create_classes()) tree_output_dir = os.path.join('.', 'output') tree_minified_output_dir = os.path.join('.', 'output_min') icon_size = 42 icon_padding = 1 sprite_css_generator = SpriteCssGenerator() for c in classes: icon_downloader.download_all(c) sprite_image_generator.generate(c, icon_size, icon_padding) filename = c.name + '.json' json_writer.write(c.to_dict(), os.path.join(tree_output_dir, filename), indent=3) json_writer.write(c.to_dict(), os.path.join(tree_minified_output_dir, filename)) if c.name == 'Beastlord': beastlord_css = sprite_css_generator.generate_css( c.trees, icon_size, icon_padding, '.Beastlord ') self._write_to_text_file( os.path.join(sprite_output_path, "sprites-beastlord.css"), beastlord_css) css = sprite_css_generator.generate_css(classes[0].trees, icon_size, icon_padding) self._write_to_text_file( os.path.join(sprite_output_path, "sprites.css"), css) end_time = datetime.datetime.now() logger.log('Done in {0}'.format(end_time - start_time))