示例#1
0
        public static bool IsEmptyTrackChunk(MidiChunk chunk)
        {
            if (chunk == null)
            {
                return(true);
            }
            else if (chunk.GetType() != typeof(TrackChunk))
            {
                return(false);
            }

            TrackChunk track = (TrackChunk)chunk;

            foreach (MidiEvent currentEvent in track.Events)
            {
                Type eventType = currentEvent.GetType();

                if (eventType == typeof(NoteOnEvent) || eventType == typeof(SetTempoEvent))
                {
                    return(false);
                }
            }

            return(true);
        }
示例#2
0
        public void CompareWithSelf_WithDefaultSettings()
        {
            var trackChunk = new TrackChunk();
            var areEqual   = MidiChunk.Equals(trackChunk, trackChunk);

            Assert.IsTrue(areEqual, "Chunk isn't equal to self.");
        }
示例#3
0
        public static bool AreEqual(MidiChunk chunk1, MidiChunk chunk2)
        {
            if (ReferenceEquals(chunk1, chunk2))
            {
                return(true);
            }

            if (ReferenceEquals(null, chunk1) || ReferenceEquals(null, chunk2))
            {
                return(false);
            }

            if (chunk1.GetType() != chunk2.GetType())
            {
                return(false);
            }

            Func <MidiChunk, MidiChunk, bool> comparer;

            if (Comparers.TryGetValue(chunk1.GetType(), out comparer))
            {
                return(comparer(chunk1, chunk2));
            }

            return(true);
        }
示例#4
0
        public void CompareWithNull()
        {
            var trackChunk = new TrackChunk();
            var areEqual   = MidiChunk.Equals(trackChunk, null, out var message);

            Assert.IsFalse(areEqual, "Chunk is equal to null.");
            Assert.IsNotNull(message, "Message is null.");
            Assert.IsNotEmpty(message, "Message is empty.");
        }
示例#5
0
        public void CompareTrackChunks_SameEventsCount_SameEvents()
        {
            var trackChunk1 = new TrackChunk(new NoteOnEvent());
            var trackChunk2 = new TrackChunk(new NoteOnEvent());

            var areEqual = MidiChunk.Equals(trackChunk1, trackChunk2, out var message);

            Assert.IsTrue(areEqual, "Chunks aren't equal.");
            Assert.IsNull(message, "Message isn't null.");
        }
示例#6
0
        public void CompareCustomChunks_WithEqualsOverride_Equal()
        {
            var customChunk1 = new CustomChunkWithEqualsOverride();
            var customChunk2 = new CustomChunkWithEqualsOverride();

            var areEqual = MidiChunk.Equals(customChunk1, customChunk2, out var message);

            Assert.IsTrue(areEqual, "Chunks aren't equal.");
            Assert.IsNull(message, "Message isn't null.");
        }
示例#7
0
        public void CompareTrackChunks_SameEventsCount_DifferentEvents()
        {
            var trackChunk1 = new TrackChunk(new NoteOnEvent());
            var trackChunk2 = new TrackChunk(new NoteOffEvent());

            var areEqual = MidiChunk.Equals(trackChunk1, trackChunk2, out var message);

            Assert.IsFalse(areEqual, "Chunks are equal.");
            Assert.IsNotNull(message, "Message is null.");
            Assert.IsNotEmpty(message, "Message is empty.");
        }
示例#8
0
        public void CompareCustomChunks_WithEqualsOverride_Different()
        {
            var customChunk1 = new CustomChunkWithEqualsOverride();
            var customChunk2 = new CustomChunkWithEqualsOverride(8);

            var areEqual = MidiChunk.Equals(customChunk1, customChunk2, out var message);

            Assert.IsFalse(areEqual, "Chunks are equal.");
            Assert.IsNotNull(message, "Message is null.");
            Assert.IsNotEmpty(message, "Message is empty.");
        }
示例#9
0
        public void CompareChunksOfDifferentType()
        {
            var trackChunk  = new TrackChunk();
            var customChunk = new CustomChunkWithoutEqualsOverride();

            var areEqual = MidiChunk.Equals(trackChunk, customChunk, out var message);

            Assert.IsFalse(areEqual, "Chunks are equal.");
            Assert.IsNotNull(message, "Message is null.");
            Assert.IsNotEmpty(message, "Message is empty.");
        }
示例#10
0
        public static bool Equals(MidiFile midiFile1, MidiFile midiFile2, MidiFileEqualityCheckSettings settings, out string message)
        {
            message = null;

            if (ReferenceEquals(midiFile1, midiFile2))
            {
                return(true);
            }

            if (ReferenceEquals(null, midiFile1) || ReferenceEquals(null, midiFile2))
            {
                message = "One of files is null.";
                return(false);
            }

            if (settings.CompareOriginalFormat)
            {
                var originalFormat1 = midiFile1._originalFormat;
                var originalFormat2 = midiFile2._originalFormat;

                if (originalFormat1 != originalFormat2)
                {
                    message = $"Original formats are different ({originalFormat1} vs {originalFormat2}).";
                    return(false);
                }
            }

            var chunks1 = midiFile1.Chunks;
            var chunks2 = midiFile2.Chunks;

            if (chunks1.Count != chunks2.Count)
            {
                message = $"Counts of chunks are different ({chunks1.Count} vs {chunks2.Count}).";
                return(false);
            }

            for (var i = 0; i < chunks1.Count; i++)
            {
                var chunk1 = chunks1[i];
                var chunk2 = chunks2[i];

                string chunksComparingMessage;
                if (!MidiChunk.Equals(chunk1, chunk2, settings.ChunkEqualityCheckSettings, out chunksComparingMessage))
                {
                    message = $"Chunks at position {i} are different. {chunksComparingMessage}";
                    return(false);
                }
            }

            return(true);
        }
示例#11
0
        public void CompareTrackChunks_CompareDeltaTimes_DifferentDeltaTimes()
        {
            var trackChunk1 = new TrackChunk(new NoteOnEvent {
                DeltaTime = 100
            });
            var trackChunk2 = new TrackChunk(new NoteOnEvent {
                DeltaTime = 1000
            });

            var areEqual = MidiChunk.Equals(trackChunk1, trackChunk2, out var message);

            Assert.IsFalse(areEqual, "Chunks are equal.");
            Assert.IsNotNull(message, "Message is null.");
            Assert.IsNotEmpty(message, "Message is empty.");
        }
示例#12
0
        public void CompareWithSelf_WithCustomSettings()
        {
            var trackChunk = new TrackChunk();
            var areEqual   = MidiChunk.Equals(
                trackChunk,
                trackChunk,
                new MidiChunkEqualityCheckSettings
            {
                EventEqualityCheckSettings = new MidiEventEqualityCheckSettings
                {
                    CompareDeltaTimes = false
                }
            },
                out var message);

            Assert.IsTrue(areEqual, "Chunk isn't equal to self.");
            Assert.IsNull(message, "Message isn't null.");
        }
示例#13
0
        public void CompareTrackChunks_DontCompareDeltaTimes(long firstDeltaTime, long secondDeltaTime)
        {
            var trackChunk1 = new TrackChunk(new NoteOnEvent {
                DeltaTime = firstDeltaTime
            });
            var trackChunk2 = new TrackChunk(new NoteOnEvent {
                DeltaTime = secondDeltaTime
            });

            var areEqual = MidiChunk.Equals(
                trackChunk1,
                trackChunk2,
                new MidiChunkEqualityCheckSettings
            {
                EventEqualityCheckSettings = new MidiEventEqualityCheckSettings
                {
                    CompareDeltaTimes = false
                }
            },
                out var message);

            Assert.IsTrue(areEqual, "Chunks aren't equal.");
            Assert.IsNull(message, "Message isn't null.");
        }
示例#14
0
        public static bool Equals(MidiChunk midiChunk1, MidiChunk midiChunk2, MidiChunkEqualityCheckSettings settings, out string message)
        {
            message = null;

            if (ReferenceEquals(midiChunk1, midiChunk2))
            {
                return(true);
            }

            if (ReferenceEquals(null, midiChunk1) || ReferenceEquals(null, midiChunk2))
            {
                message = "One of chunks is null.";
                return(false);
            }

            var type1 = midiChunk1.GetType();
            var type2 = midiChunk2.GetType();

            if (type1 != type2)
            {
                message = $"Types of chunks are different ({type1} vs {type2}).";
                return(false);
            }

            var trackChunk1 = midiChunk1 as TrackChunk;

            if (trackChunk1 != null)
            {
                var trackChunk2 = (TrackChunk)midiChunk2;

                var events1 = trackChunk1.Events;
                var events2 = trackChunk2.Events;

                if (events1.Count != events2.Count)
                {
                    message = $"Counts of events in track chunks are different ({events1.Count} vs {events2.Count}).";
                    return(false);
                }

                for (var i = 0; i < events1.Count; i++)
                {
                    var event1 = events1[i];
                    var event2 = events2[i];

                    string eventsComparingMessage;
                    if (!MidiEvent.Equals(event1, event2, settings.EventEqualityCheckSettings, out eventsComparingMessage))
                    {
                        message = $"Events at position {i} in track chunks are different. {eventsComparingMessage}";
                        return(false);
                    }
                }

                return(true);
            }

            var unknownChunk1 = midiChunk1 as UnknownChunk;

            if (unknownChunk1 != null)
            {
                var unknownChunk2 = (UnknownChunk)midiChunk2;

                var chunkId1 = unknownChunk1.ChunkId;
                var chunkId2 = unknownChunk2.ChunkId;

                if (chunkId1 != chunkId2)
                {
                    message = $"IDs of unknown chunks are different ({chunkId1} vs {chunkId2}).";
                    return(false);
                }

                if (!ArrayUtilities.Equals(unknownChunk1.Data, unknownChunk2.Data))
                {
                    message = "Unknown chunks data are different.";
                    return(false);
                }

                return(true);
            }

            return(midiChunk1.Equals(midiChunk2));
        }
示例#15
0
        public void GetStandardChunkIds()
        {
            var ids = MidiChunk.GetStandardChunkIds();

            CollectionAssert.AreEqual(new[] { "MThd", "MTrk" }, ids, "IDs are invalid.");
        }
示例#16
0
        public static bool Equals(MidiChunk midiChunk1, MidiChunk midiChunk2, MidiChunkEqualityCheckSettings settings, out string message)
        {
            message = null;

            if (ReferenceEquals(midiChunk1, midiChunk2))
            {
                return(true);
            }

            if (ReferenceEquals(null, midiChunk1) || ReferenceEquals(null, midiChunk2))
            {
                message = "One of chunks is null.";
                return(false);
            }

            var type1 = midiChunk1.GetType();
            var type2 = midiChunk2.GetType();

            if (type1 != type2)
            {
                message = $"Types of chunks are different ({type1} vs {type2}).";
                return(false);
            }

            var trackChunk1 = midiChunk1 as TrackChunk;

            if (trackChunk1 != null)
            {
                var trackChunk2 = (TrackChunk)midiChunk2;
                return(EventsCollectionEquality.Equals(trackChunk1.Events, trackChunk2.Events, settings.EventEqualityCheckSettings, out message));
            }

            var unknownChunk1 = midiChunk1 as UnknownChunk;

            if (unknownChunk1 != null)
            {
                var unknownChunk2 = (UnknownChunk)midiChunk2;

                var chunkId1 = unknownChunk1.ChunkId;
                var chunkId2 = unknownChunk2.ChunkId;

                if (chunkId1 != chunkId2)
                {
                    message = $"IDs of unknown chunks are different ({chunkId1} vs {chunkId2}).";
                    return(false);
                }

                if (!ArrayUtilities.Equals(unknownChunk1.Data, unknownChunk2.Data))
                {
                    message = "Unknown chunks data are different.";
                    return(false);
                }

                return(true);
            }

            var result = midiChunk1.Equals(midiChunk2);

            if (!result)
            {
                message = $"Chunks {midiChunk1} and {midiChunk2} are not equal by result of Equals call on first chunk.";
            }

            return(result);
        }