void TestSort(int arraySize, int [] partSizes, int inMemSortSize, int rngSeed, int shuffleSize, bool isVerbose) { string inputDir = Path.Combine(_outDir, "input"); DirectoryExt.Delete(inputDir); Directory.CreateDirectory(inputDir); string tempDir = Path.Combine(_outDir, "temp"); int[] array = new int[arraySize]; for (int i = 0; i < array.Length; ++i) { array[i] = i; } SequenceRng rng = new SequenceRng(rngSeed); rng.SetSequenceNoCopy(array); rng.Shuffle(shuffleSize); TestElement element = new TestElement(); int begin = 0; for (int p = 0; p < partSizes.Length; ++p) { string fileName = Path.Combine(inputDir, string.Format("{0}.dat", p)); using (BinaryWriter writer = new BinaryWriter(new FileStream(fileName, FileMode.Create, FileAccess.Write))) { for (int i = begin; i < begin + partSizes[p]; ++i) { element.Write(array[i], writer); } begin += partSizes[p]; } } Assert.AreEqual(arraySize, begin, "Incorrect part sizes."); string resultFile = Path.Combine(_outDir, "result.dat"); ExternalMergeSort <int> sorter = new ExternalMergeSort <int> { IsVerbose = isVerbose }; sorter.Sort(inputDir, tempDir, inMemSortSize, element, resultFile); int[] result = ReadToArray(resultFile, element); for (int i = 0; i < arraySize; ++i) { Assert.AreEqual(i, result[i]); } }
int[] ReadToArray(string fileName, ExternalMergeSort <int> .IElement element) { FileInfo f = new FileInfo(fileName); int[] arr = new int[f.Length / 4]; int count = 0; using (FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read)) { using (BinaryReader r = new BinaryReader(fs)) { for (; fs.Position < f.Length;) { arr[count++] = element.Read(r); } } } return(arr); }