Skip to content

Commit

Permalink
Added EncoderStrategyTest class to unit test EncoderStrategy class an…
Browse files Browse the repository at this point in the history
…d solve work item 10742 (Failed assertion in EncodeStrategy)
  • Loading branch information
vbaderks committed Jan 10, 2015
1 parent 1f31322 commit c7cf959
Show file tree
Hide file tree
Showing 6 changed files with 176 additions and 109 deletions.
8 changes: 6 additions & 2 deletions src/colortransform.h
Expand Up @@ -4,15 +4,19 @@
#ifndef CHARLS_COLORTRANSFORM
#define CHARLS_COLORTRANSFORM

//

#include "util.h"


// This file defines simple classes that define (lossless) color transforms.
// They are invoked in processline.h to convert between decoded values and the internal line buffers.
// Color transforms work best for computer generated images.
// Color transforms work best for computer generated images.
//
#ifdef _MSC_VER
#pragma warning (disable: 4127) // conditional expression is constant (caused by some template methods that are not fully specialized) [VS2013]
#endif


template<class sample>
struct TransformNoneImpl
{
Expand Down
2 changes: 2 additions & 0 deletions src/encoderstrategy.h
Expand Up @@ -6,6 +6,8 @@
#define CHARLS_ENCODERSTRATEGY

#include "processline.h"
#include "decoderstrategy.h"


// Purpose: Implements encoding to stream of bits. In encoding mode JpegLsCodec inherits from EncoderStrategy
class EncoderStrategy
Expand Down
3 changes: 3 additions & 0 deletions unittest/CharLSUnitTest_VS2013.vcxproj
Expand Up @@ -44,9 +44,11 @@
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<LinkIncremental>true</LinkIncremental>
<OutDir>..\bin\$(Platform)\$(Configuration)\</OutDir>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<LinkIncremental>true</LinkIncremental>
<OutDir>..\bin\$(Platform)\$(Configuration)\</OutDir>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
Expand Down Expand Up @@ -88,6 +90,7 @@
<ClInclude Include="targetver.h" />
</ItemGroup>
<ItemGroup>
<ClCompile Include="encoderstrategytest.cpp" />
<ClCompile Include="jpegmarkersegmenttest.cpp" />
<ClCompile Include="stdafx.cpp">
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
Expand Down
3 changes: 3 additions & 0 deletions unittest/CharLSUnitTest_VS2013.vcxproj.filters
Expand Up @@ -32,5 +32,8 @@
<ClCompile Include="jpegmarkersegmenttest.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="encoderstrategytest.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
</Project>
55 changes: 55 additions & 0 deletions unittest/encoderstrategytest.cpp
@@ -0,0 +1,55 @@
//
// (C) CharLS Team 2014, all rights reserved. See the accompanying "License.txt" for licensed use.
//

#include "stdafx.h"

#include "CppUnitTest.h"
#include "..\src\encoderstrategy.h"

using namespace Microsoft::VisualStudio::CppUnitTestFramework;


class EncoderStrategyTester : EncoderStrategy
{
public:
EncoderStrategyTester(const JlsParameters& info) : EncoderStrategy(info)
{
}

virtual void SetPresets(const JlsCustomParameters&)
{
}

virtual size_t EncodeScan(std::unique_ptr<ProcessLine>, ByteStreamInfo*, void*)
{
return 0;
}

virtual ProcessLine* CreateProcess(ByteStreamInfo)
{
return nullptr;
}

void AppendToBitStreamTest(int32_t value, int32_t length)
{
AppendToBitStream(value, length);
}
};


namespace CharLSUnitTest
{
TEST_CLASS(EncoderStrategyTest)
{
public:
TEST_METHOD(AppendToBitStream)
{
JlsParameters info;

EncoderStrategyTester es(info);

es.AppendToBitStreamTest(0, 0);
}
};
}
214 changes: 107 additions & 107 deletions unittest/jpegmarkersegmenttest.cpp
Expand Up @@ -12,111 +12,111 @@ using namespace Microsoft::VisualStudio::CppUnitTestFramework;

namespace CharLSUnitTest
{
TEST_CLASS(JpegMarkerSegmentTest)
{
private:
static size_t SerializeSegment(JpegMarkerSegment* segment, uint8_t* buffer, size_t count)
{
ByteStreamInfo info = FromByteArray(buffer, count);
JpegStreamWriter writer;
writer.AddSegment(segment);
auto bytesWritten = writer.Write(info);

Assert::IsTrue(bytesWritten >= 4);

Assert::AreEqual(static_cast<uint8_t>(0xFF), buffer[0]);
Assert::AreEqual(static_cast<uint8_t>(0xD8), buffer[1]); // JPEG_SOI

Assert::AreEqual(static_cast<uint8_t>(0xFF), buffer[bytesWritten - 2]);
Assert::AreEqual(static_cast<uint8_t>(0xD9), buffer[bytesWritten - 1]); // JPEG_EOI

return bytesWritten;
}

public:
TEST_METHOD(CreateStartOfFrameMarker)
{
int32_t bitsPerSample = 8;
int32_t componentCount = 3;

JpegMarkerSegment* segment = JpegMarkerSegment::CreateStartOfFrameMarker(100, UINT16_MAX, bitsPerSample, componentCount);

uint8_t buffer[23];
auto bytesWritten = SerializeSegment(segment, buffer, _countof(buffer));

Assert::AreEqual(static_cast<size_t>(23), bytesWritten);
Assert::AreEqual(static_cast<uint8_t>(0xFF), buffer[2]);
Assert::AreEqual(static_cast<uint8_t>(0xF7), buffer[3]); // JPEG_SOF_55
Assert::AreEqual(static_cast<uint8_t>(0), buffer[4]); // 6 + (3 * 3) + 2 (in little endian)
Assert::AreEqual(static_cast<uint8_t>(17), buffer[5]); // 6 + (3 * 3) + 2 (in little endian)
Assert::AreEqual(static_cast<uint8_t>(bitsPerSample), buffer[6]);
Assert::AreEqual(static_cast<uint8_t>(255), buffer[7]); // height (in little endian)
Assert::AreEqual(static_cast<uint8_t>(255), buffer[8]); // height (in little endian)
Assert::AreEqual(static_cast<uint8_t>(0), buffer[9]); // width (in little endian)
Assert::AreEqual(static_cast<uint8_t>(100), buffer[10]); // width (in little endian)
Assert::AreEqual(static_cast<uint8_t>(componentCount), buffer[11]);

Assert::AreEqual(static_cast<uint8_t>(1), buffer[12]);
Assert::AreEqual(static_cast<uint8_t>(0x11), buffer[13]);
Assert::AreEqual(static_cast<uint8_t>(0), buffer[14]);

Assert::AreEqual(static_cast<uint8_t>(2), buffer[15]);
Assert::AreEqual(static_cast<uint8_t>(0x11), buffer[16]);
Assert::AreEqual(static_cast<uint8_t>(0), buffer[17]);

Assert::AreEqual(static_cast<uint8_t>(3), buffer[18]);
Assert::AreEqual(static_cast<uint8_t>(0x11), buffer[19]);
Assert::AreEqual(static_cast<uint8_t>(0), buffer[20]);

//delete segment;
}

TEST_METHOD(CreateStartOfFrameMarkerWithLowBoundaryValues)
{
JpegMarkerSegment* segment = JpegMarkerSegment::CreateStartOfFrameMarker(0, 0, 1, 1);

uint8_t buffer[17];
auto bytesWritten = SerializeSegment(segment, buffer, _countof(buffer));
Assert::AreEqual(static_cast<size_t>(17), bytesWritten);
Assert::AreEqual(static_cast<uint8_t>(1), buffer[6]);
Assert::AreEqual(static_cast<uint8_t>(1), buffer[11]);
//delete segment;
}

TEST_METHOD(CreateStartOfFrameMarkerWithHighBoundaryValues)
{
JpegMarkerSegment* segment = JpegMarkerSegment::CreateStartOfFrameMarker(UINT16_MAX, UINT16_MAX, UINT8_MAX, UINT8_MAX - 1);

uint8_t buffer[776];
auto bytesWritten = SerializeSegment(segment, buffer, _countof(buffer));
Assert::AreEqual(static_cast<size_t>(776), bytesWritten);
Assert::AreEqual(static_cast<uint8_t>(UINT8_MAX), buffer[6]);
Assert::AreEqual(static_cast<uint8_t>(UINT8_MAX - 1), buffer[11]);
//delete segment;
}

TEST_METHOD(CreateJpegFileInterchangeFormatMarker)
{
// TODO
//static JpegMarkerSegment* CreateJpegFileInterchangeFormatMarker(const JfifParameters& jfif);
}

TEST_METHOD(CreateJpegLSExtendedParametersMarker)
{
// TODO
//static JpegMarkerSegment* CreateJpegLSExtendedParametersMarker(const JlsCustomParameters& pcustom);
}

TEST_METHOD(CreateColorTransformMarker)
{
// TODO
//static JpegMarkerSegment* CreateColorTransformMarker(int i);
}

TEST_METHOD(CreateStartOfScanMarker)
{
// TODO
//static JpegMarkerSegment* CreateStartOfScanMarker(const JlsParameters* pparams, int32_t icomponent);
}
};
TEST_CLASS(JpegMarkerSegmentTest)
{
private:
static size_t SerializeSegment(JpegMarkerSegment* segment, uint8_t* buffer, size_t count)
{
ByteStreamInfo info = FromByteArray(buffer, count);
JpegStreamWriter writer;
writer.AddSegment(segment);
auto bytesWritten = writer.Write(info);

Assert::IsTrue(bytesWritten >= 4);

Assert::AreEqual(static_cast<uint8_t>(0xFF), buffer[0]);
Assert::AreEqual(static_cast<uint8_t>(0xD8), buffer[1]); // JPEG_SOI

Assert::AreEqual(static_cast<uint8_t>(0xFF), buffer[bytesWritten - 2]);
Assert::AreEqual(static_cast<uint8_t>(0xD9), buffer[bytesWritten - 1]); // JPEG_EOI

return bytesWritten;
}

public:
TEST_METHOD(CreateStartOfFrameMarker)
{
int32_t bitsPerSample = 8;
int32_t componentCount = 3;

JpegMarkerSegment* segment = JpegMarkerSegment::CreateStartOfFrameMarker(100, UINT16_MAX, bitsPerSample, componentCount);

uint8_t buffer[23];
auto bytesWritten = SerializeSegment(segment, buffer, _countof(buffer));

Assert::AreEqual(static_cast<size_t>(23), bytesWritten);
Assert::AreEqual(static_cast<uint8_t>(0xFF), buffer[2]);
Assert::AreEqual(static_cast<uint8_t>(0xF7), buffer[3]); // JPEG_SOF_55
Assert::AreEqual(static_cast<uint8_t>(0), buffer[4]); // 6 + (3 * 3) + 2 (in little endian)
Assert::AreEqual(static_cast<uint8_t>(17), buffer[5]); // 6 + (3 * 3) + 2 (in little endian)
Assert::AreEqual(static_cast<uint8_t>(bitsPerSample), buffer[6]);
Assert::AreEqual(static_cast<uint8_t>(255), buffer[7]); // height (in little endian)
Assert::AreEqual(static_cast<uint8_t>(255), buffer[8]); // height (in little endian)
Assert::AreEqual(static_cast<uint8_t>(0), buffer[9]); // width (in little endian)
Assert::AreEqual(static_cast<uint8_t>(100), buffer[10]); // width (in little endian)
Assert::AreEqual(static_cast<uint8_t>(componentCount), buffer[11]);

Assert::AreEqual(static_cast<uint8_t>(1), buffer[12]);
Assert::AreEqual(static_cast<uint8_t>(0x11), buffer[13]);
Assert::AreEqual(static_cast<uint8_t>(0), buffer[14]);

Assert::AreEqual(static_cast<uint8_t>(2), buffer[15]);
Assert::AreEqual(static_cast<uint8_t>(0x11), buffer[16]);
Assert::AreEqual(static_cast<uint8_t>(0), buffer[17]);

Assert::AreEqual(static_cast<uint8_t>(3), buffer[18]);
Assert::AreEqual(static_cast<uint8_t>(0x11), buffer[19]);
Assert::AreEqual(static_cast<uint8_t>(0), buffer[20]);

//delete segment;
}

TEST_METHOD(CreateStartOfFrameMarkerWithLowBoundaryValues)
{
JpegMarkerSegment* segment = JpegMarkerSegment::CreateStartOfFrameMarker(0, 0, 1, 1);

uint8_t buffer[17];
auto bytesWritten = SerializeSegment(segment, buffer, _countof(buffer));
Assert::AreEqual(static_cast<size_t>(17), bytesWritten);
Assert::AreEqual(static_cast<uint8_t>(1), buffer[6]);
Assert::AreEqual(static_cast<uint8_t>(1), buffer[11]);
//delete segment;
}

TEST_METHOD(CreateStartOfFrameMarkerWithHighBoundaryValues)
{
JpegMarkerSegment* segment = JpegMarkerSegment::CreateStartOfFrameMarker(UINT16_MAX, UINT16_MAX, UINT8_MAX, UINT8_MAX - 1);

uint8_t buffer[776];
auto bytesWritten = SerializeSegment(segment, buffer, _countof(buffer));
Assert::AreEqual(static_cast<size_t>(776), bytesWritten);
Assert::AreEqual(static_cast<uint8_t>(UINT8_MAX), buffer[6]);
Assert::AreEqual(static_cast<uint8_t>(UINT8_MAX - 1), buffer[11]);
//delete segment;
}

TEST_METHOD(CreateJpegFileInterchangeFormatMarker)
{
// TODO
//static JpegMarkerSegment* CreateJpegFileInterchangeFormatMarker(const JfifParameters& jfif);
}

TEST_METHOD(CreateJpegLSExtendedParametersMarker)
{
// TODO
//static JpegMarkerSegment* CreateJpegLSExtendedParametersMarker(const JlsCustomParameters& pcustom);
}

TEST_METHOD(CreateColorTransformMarker)
{
// TODO
//static JpegMarkerSegment* CreateColorTransformMarker(int i);
}

TEST_METHOD(CreateStartOfScanMarker)
{
// TODO
//static JpegMarkerSegment* CreateStartOfScanMarker(const JlsParameters* pparams, int32_t icomponent);
}
};
}

0 comments on commit c7cf959

Please sign in to comment.