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);
        }