示例#1
0
        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));
        }
示例#2
0
        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);
        }
示例#3
0
        public void Rom_GetLuigiHeaderFromNullRom_ReturnsNull()
        {
            RomTestStorageAccess.Initialize();

            Assert.Null(Rom.GetLuigiHeader(null));
        }