TEST(ReachabilitySphere, convertToCapability) { Capability capability(CONE, 70.0, 55.0, 25.0); ReachabilitySphere sphere = createReachabilitySphereFromCapability(capability, 500); Capability testCapability = sphere.convertToCapability(); ASSERT_TRUE(testCapability.getType() == CONE); ASSERT_TRUE(std::abs(testCapability.getPhi() - capability.getPhi()) < 2.0); ASSERT_TRUE(std::abs(testCapability.getTheta() - capability.getTheta()) < 2.0); ASSERT_TRUE(std::abs(testCapability.getHalfOpeningAngle() - capability.getHalfOpeningAngle()) < 2.0); ASSERT_EQ(0.0, testCapability.getShapeFitError()); capability = Capability(CYLINDER_1, 70.0, 55.0, 25.0); sphere = createReachabilitySphereFromCapability(capability, 10000); testCapability = sphere.convertToCapability(); ASSERT_TRUE(testCapability.getType() == CYLINDER_1); ASSERT_TRUE(std::abs(testCapability.getPhi() - capability.getPhi()) < 2.0); ASSERT_TRUE(std::abs(testCapability.getTheta() - capability.getTheta()) < 2.0); ASSERT_TRUE(std::abs(testCapability.getHalfOpeningAngle() - capability.getHalfOpeningAngle()) < 2.0); // ASSERT_EQ(0.0, testCapability.getShapeFitError()); // TODO: improve PCA to get correct axis (for now SFE could be 0.0 but is higher) capability = Capability(CYLINDER_2, 70.0, 55.0, 25.0); sphere = createReachabilitySphereFromCapability(capability, 10000); testCapability = sphere.convertToCapability(); ASSERT_TRUE(testCapability.getType() == CYLINDER_2); ASSERT_TRUE(std::abs(testCapability.getPhi() - capability.getPhi()) < 2.0); ASSERT_TRUE(std::abs(testCapability.getTheta() - capability.getTheta()) < 2.0); ASSERT_TRUE(std::abs(testCapability.getHalfOpeningAngle() - capability.getHalfOpeningAngle()) < 2.0); // ASSERT_EQ(0.0, testCapability.getShapeFitError()); }
bool ProfileDB::internalMatchProfile(Profile* profile, vector<Capability>& requiredCapabilites, vector<Capability>& optionalCapabilites, string& matchToken) { bool match = true; // When can we NOT reuse a specific runtime? // Only if fragmentation is set to BUILDTIME and if either a) one supports the capability and // the other does not OR b) the capability value differs. // So we add strings to create a unique match token for every // runtime that need be built for (vector<Capability>::iterator capability = requiredCapabilites.begin(); capability != requiredCapabilites.end(); capability++) { Capability matchedCapability = profile->getCapability( capability->getName()); CapabilityState matchedState = matchedCapability.getState(); // Ok, so we don't support this, bail out! if (matchedState == NOT_IMPLEMENTED || matchedState == UNSUPPORTED) { match = false; } Fragmentation fragmentation = matchedCapability.getFragmentation(); string valueStr = fragmentation == BUILDTIME ? matchedCapability.getValue() : ""; matchToken.append(valueStr); matchToken.append("|"); } // So, the optional capabilities are matched in a different way. // We add stuff to the matchTokens string to produce a string that // is unique to the optional capabilities being matched. for (vector<Capability>::iterator capability = optionalCapabilites.begin(); capability != optionalCapabilites.end(); capability++) { Capability matchedCapability = profile->getCapability( capability->getName()); CapabilityState matchedState = matchedCapability.getState(); Fragmentation fragmentation = matchedCapability.getFragmentation(); string valueStr = fragmentation == BUILDTIME ? matchedCapability.getValue() : ""; bool capSupported = fragmentation == BUILDTIME && (matchedState == NOT_IMPLEMENTED || matchedState == UNSUPPORTED); matchToken.append((capSupported ? "+" : "-") + valueStr); matchToken.append("|"); } // Finally we add PROPERTIES of the runtime which are buildtime fragmented. // For example, different device types or icon sizes should always generate // a unique runtime. set<string> allCapabilities = profile->getCapabilities(); for (set<string>::iterator allCapabilitesIt = allCapabilities.begin(); allCapabilitesIt != allCapabilities.end(); allCapabilitesIt++) { string capabilityName = *allCapabilitesIt; Capability capability = profile->getCapability(capabilityName); if (capability.getType() == "property") { Fragmentation fragmentation = capability.getFragmentation(); string valueStr = fragmentation == BUILDTIME ? capability.getValue() : "-"; matchToken.append(valueStr); matchToken.append("|"); } } return match; }