public void Rom_GetLuigiHeaderFromLuigiRom_ReturnsHeader() { var romPath = RomTestStorageAccess.Initialize(TestRomResources.TestLuigiFromBinPath).First(); var rom = Rom.Create(romPath, null); Assert.NotNull(rom); Assert.NotNull(Rom.GetLuigiHeader(rom)); }
protected int CanonicalCompare(IRom rom, IRom otherRom, bool includeFeatures) { // Always do the compare based on canonical form. Perhaps we could optimize for cases when 'rom' and 'otherRom' // are both already the same format... This could save considerable time in cases such as adding ROMs from a CD or // thumb drive, in which case temporary local copies must be made, in addition to possible temporary LUIGI copies. var result = -1; try { IRom canonicalReferenceRom = rom; var createdCanonicalReferenceRom = false; if ((rom.Format != CanonicalRomFormat) && !TemporaryCanonicalRoms.TryGetValue(rom.RomPath, out canonicalReferenceRom)) { // rom isn't in canonical format, and we haven't already cached a canonical form of it -- so create one var isTemporary = false; createdCanonicalReferenceRom = CanonicalRomNeedsUpdate(rom, out canonicalReferenceRom, out isTemporary); // will return existing if possible if ((canonicalReferenceRom == null) || isTemporary) { canonicalReferenceRom = GetCanonicalRomForCompare(rom, isTemporary); if (isTemporary) { TemporaryCanonicalRoms[rom.RomPath] = canonicalReferenceRom; } } } IRom canonicalOtherRom = otherRom; if ((otherRom.Format != CanonicalRomFormat) && !TemporaryCanonicalRoms.TryGetValue(otherRom.RomPath, out canonicalOtherRom)) { // otherRom isn't in canonical format, and we haven't already cached a canonical form of it -- so create one var isTemporary = false; CanonicalRomNeedsUpdate(otherRom, out canonicalOtherRom, out isTemporary); isTemporary |= createdCanonicalReferenceRom; if ((canonicalOtherRom == null) || isTemporary) { canonicalOtherRom = GetCanonicalRomForCompare(otherRom, isTemporary); if (isTemporary) { TemporaryCanonicalRoms[otherRom.RomPath] = canonicalOtherRom; } } } result = includeFeatures ? RomComparerStrict.Default.Compare(canonicalReferenceRom, canonicalOtherRom) : RomComparerStrictCrcOnly.Default.Compare(canonicalReferenceRom, canonicalOtherRom); if ((result != 0) && (canonicalReferenceRom != null) && (canonicalOtherRom != null)) { // ROMs are not considered equal based on the more simplistic, fast check. Do the full canonical check. var doCrc = true; if (includeFeatures) { var referenceFeatures = (ulong)Rom.GetLuigiHeader(canonicalReferenceRom).Features; var otherFeatures = (ulong)Rom.GetLuigiHeader(canonicalOtherRom).Features; var featureDifferences = (referenceFeatures ^ otherFeatures) & ~(ulong)LuigiFeatureFlags.FeatureFlagsExplicitlySet; if (featureDifferences == 0) { referenceFeatures = (ulong)Rom.GetLuigiHeader(canonicalReferenceRom).Features2; otherFeatures = (ulong)Rom.GetLuigiHeader(canonicalOtherRom).Features2; featureDifferences = referenceFeatures ^ otherFeatures; } doCrc = featureDifferences == 0; if (!doCrc) { result = -1; } } if (doCrc) { // always skip including features in the CRC because of the 'explicitly set' bit. var referenceCrc = INTV.Core.Utility.Crc32.OfFile(canonicalReferenceRom.RomPath, Rom.GetComparisonIgnoreRanges(canonicalReferenceRom, true)); var otherCrc = INTV.Core.Utility.Crc32.OfFile(canonicalOtherRom.RomPath, Rom.GetComparisonIgnoreRanges(canonicalOtherRom, true)); result = (int)referenceCrc - (int)otherCrc; } } } catch (System.InvalidOperationException) { } return(result); }
public void Rom_GetLuigiHeaderFromNullRom_ReturnsNull() { RomTestStorageAccess.Initialize(); Assert.Null(Rom.GetLuigiHeader(null)); }