void checkLootGroupEntryRecursive(String& entryName, Vector<String>* parentGroups) { if (entryName.isEmpty()) return; //Check for infinite recursion for (int i = 0; i < parentGroups->size(); i++) { String parentName = parentGroups->get(i); EXPECT_FALSE( parentName == entryName ) << "Loot group " << std::string(parentName.toCharArray()) << " failed recursion check."; if (parentName == entryName) return; } if (lootGroupMap->lootGroupExists(entryName)) { LootGroupTemplate* lootGroupTemplate = lootGroupMap->getLootGroupTemplate(entryName); for (int j = 0; j < lootGroupTemplate->size(); j++) { String entry = lootGroupTemplate->getLootGroupEntryAt(j); parentGroups->add(entryName); checkLootGroupEntryRecursive(entry, parentGroups); } } else { Reference<LootItemTemplate*> itemTemplate = lootGroupMap->getLootItemTemplate( entryName ); EXPECT_TRUE( itemTemplate != NULL ) << "Item template " << std::string(entryName.toCharArray()) << " from " << std::string(parentGroups->get(parentGroups->size() - 1).toCharArray()) << " was not found in LootGroupMap"; } }
TEST_F(LuaMobileTest, LuaLootGroupsTest) { // Verify loot group map loaded ASSERT_EQ(LootGroupMap::ERROR_CODE, 0); // Test Loot Items HashTableIterator<String, Reference<LootItemTemplate*> > itemIter = lootGroupMap->itemTemplates.iterator(); while (itemIter.hasNext()) { LootItemTemplate* lootItemTemplate = itemIter.next(); String itemTemplateName( lootItemTemplate->getTemplateName().toCharArray() ); // Make sure that no loot items have the same name as a loot group EXPECT_FALSE( lootGroupMap->lootGroupExists(itemTemplateName) ) << "Loot item " << std::string(itemTemplateName.toCharArray()) << " has the same name as a loot group."; // Verify that directObjectTemplate is valid String directObjectTemplate = lootItemTemplate->getDirectObjectTemplate(); SharedObjectTemplate* templateObject = templateManager->getTemplate(directObjectTemplate.hashCode()); EXPECT_TRUE( templateObject != NULL && templateObject->isSharedTangibleObjectTemplate() ) << "directObjectTemplate is invalid in loot item " << std::string(itemTemplateName.toCharArray()); } // Test Loot Groups HashTableIterator<String, Reference<LootGroupTemplate*> > iter = lootGroupMap->groupTemplates.iterator(); while (iter.hasNext()) { LootGroupTemplate* lootGroupTemplate = iter.next(); String groupTemplateName( lootGroupTemplate->getTemplateName().toCharArray() ); // Verify that group is not empty EXPECT_TRUE( lootGroupTemplate->getLootGroupEntryForRoll(-1).length() > 0 ) << "No entries in loot group: " << std::string(groupTemplateName.toCharArray()); // Check loot group to make sure their chances total correctly EXPECT_GT( lootGroupTemplate->getLootGroupEntryForRoll(10000000).length(), 0 ) << "Item total chance is less than 10000000: " << std::string(groupTemplateName.toCharArray()); EXPECT_EQ( lootGroupTemplate->getLootGroupEntryForRoll(10000001).length(), 0 ) << "Item total chance is greater than 10000000: " << std::string(groupTemplateName.toCharArray()); // Check that all loot group entries are valid for( int i = 0; i < lootGroupTemplate->size(); i++ ){ Vector<String> parentGroups; parentGroups.add(groupTemplateName); String entryName = lootGroupTemplate->getLootGroupEntryAt(i); checkLootGroupEntryRecursive(entryName, &parentGroups); } } }
TEST_F(LuaMobileTest, LuaLootGroupsTest) { LootGroupMap* lootGroupMap = LootGroupMap::instance(); ASSERT_EQ(lootGroupMap->initialize(), 0); //Make sure that no loot items have the same name as a loot group HashTableIterator<String, Reference<LootItemTemplate*> > itemIter = lootGroupMap->itemTemplates.iterator(); while (itemIter.hasNext()) { LootItemTemplate* lootItemTemplate = itemIter.next(); String itemTemplateName( lootItemTemplate->getTemplateName().toCharArray() ); EXPECT_FALSE( lootGroupMap->lootGroupExists(itemTemplateName) ) << "Loot item " << std::string(itemTemplateName.toCharArray()) << " has the same name as a loot group."; } HashTableIterator<String, Reference<LootGroupTemplate*> > iter = lootGroupMap->groupTemplates.iterator(); while (iter.hasNext()) { LootGroupTemplate* lootGroupTemplate = iter.next(); String groupTemplateName( lootGroupTemplate->getTemplateName().toCharArray() ); // Check non-empty loot groups to make sure their chances total correctly if( lootGroupTemplate->getLootGroupEntryForRoll(-1).length() > 0 ){ EXPECT_GT( lootGroupTemplate->getLootGroupEntryForRoll(10000000).length(), 0 ) << "Item total chance is less than 10000000: " << std::string(groupTemplateName.toCharArray()); EXPECT_EQ( lootGroupTemplate->getLootGroupEntryForRoll(10000001).length(), 0 ) << "Item total chance is greater than 10000000: " << std::string(groupTemplateName.toCharArray()); } // Check that all loot group entries are valid for( int i = 0; i < lootGroupTemplate->size(); i++ ){ Vector<String> parentGroups; parentGroups.add(groupTemplateName); String entryName = lootGroupTemplate->getLootGroupEntryAt(i); checkLootGroupEntryRecursive(lootGroupMap, entryName, &parentGroups); } } }