Index: src/libchcore/Tests/TOrderedBufferQueueTests.cpp
===================================================================
diff -u -N -rbef894e38e5c1486824787cf8c47a87a0828b228 -rb6a48931b8155a01d871d050f52d915abb2df8ca
--- src/libchcore/Tests/TOrderedBufferQueueTests.cpp	(.../TOrderedBufferQueueTests.cpp)	(revision bef894e38e5c1486824787cf8c47a87a0828b228)
+++ src/libchcore/Tests/TOrderedBufferQueueTests.cpp	(.../TOrderedBufferQueueTests.cpp)	(revision b6a48931b8155a01d871d050f52d915abb2df8ca)
@@ -3,6 +3,7 @@
 #include "gmock/gmock.h"
 #include "../TOrderedBufferQueue.h"
 #include "../GTestMacros.h"
+#include "../TCoreException.h"
 
 using namespace chcore;
 
@@ -200,3 +201,81 @@
 
 	EXPECT_EQ(1, spReleaseList->GetCount());
 }
+
+/////////////////////////////////////////////////////////////////////////
+// custom, specialized functionality
+
+TEST(TOrderedBufferQueueTests, GetUnneededLastParts_NoLastParts)
+{
+	TOrderedBufferQueue queue(0);
+	TOverlappedDataBuffer buffer1(1024, nullptr);
+	buffer1.SetFilePosition(1000);
+	buffer1.SetRequestedDataSize(1000);
+	TOverlappedDataBuffer buffer2(1024, nullptr);
+	buffer2.SetFilePosition(0);
+	buffer2.SetRequestedDataSize(1000);
+
+	queue.Push(&buffer1);
+	queue.Push(&buffer2);
+
+	auto vParts = queue.GetUnneededLastParts();
+
+	EXPECT_EQ(0, vParts.size());
+}
+
+TEST(TOrderedBufferQueueTests, GetUnneededLastParts_SingleLastPart)
+{
+	TOrderedBufferQueue queue(0);
+	TOverlappedDataBuffer buffer1(1024, nullptr);
+	buffer1.SetFilePosition(1000);
+	buffer1.SetRequestedDataSize(1000);
+	buffer1.SetLastPart(true);
+	TOverlappedDataBuffer buffer2(1024, nullptr);
+	buffer2.SetFilePosition(0);
+	buffer2.SetRequestedDataSize(1000);
+
+	queue.Push(&buffer1);
+	queue.Push(&buffer2);
+
+	auto vParts = queue.GetUnneededLastParts();
+
+	EXPECT_EQ(0, vParts.size());
+}
+
+TEST(TOrderedBufferQueueTests, GetUnneededLastParts_UnfinishedBufferAfterFinished)
+{
+	TOrderedBufferQueue queue(0);
+	TOverlappedDataBuffer buffer1(1024, nullptr);
+	buffer1.SetFilePosition(1000);
+	buffer1.SetRequestedDataSize(1000);
+	TOverlappedDataBuffer buffer2(1024, nullptr);
+	buffer2.SetFilePosition(0);
+	buffer2.SetRequestedDataSize(1000);
+	buffer2.SetLastPart(true);
+
+	queue.Push(&buffer1);
+	queue.Push(&buffer2);
+
+	EXPECT_THROW(queue.GetUnneededLastParts(), TCoreException);
+}
+
+TEST(TOrderedBufferQueueTests, GetUnneededLastParts_TwoLastParts)
+{
+	TOrderedBufferQueue queue(0);
+	TOverlappedDataBuffer buffer1(1024, nullptr);
+	buffer1.SetFilePosition(1000);
+	buffer1.SetRequestedDataSize(1000);
+	buffer1.SetLastPart(true);
+	TOverlappedDataBuffer buffer2(1024, nullptr);
+	buffer2.SetFilePosition(0);
+	buffer2.SetRequestedDataSize(1000);
+	buffer2.SetLastPart(true);
+
+	queue.Push(&buffer1);
+	queue.Push(&buffer2);
+
+	auto vParts = queue.GetUnneededLastParts();
+
+	EXPECT_EQ(1, vParts.size());
+	EXPECT_EQ(&buffer1, vParts[0]);
+}