diff options
Diffstat (limited to 'tests/FlattenableCustomFactory.cpp')
-rw-r--r-- | tests/FlattenableCustomFactory.cpp | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/tests/FlattenableCustomFactory.cpp b/tests/FlattenableCustomFactory.cpp new file mode 100644 index 0000000000..794f76872a --- /dev/null +++ b/tests/FlattenableCustomFactory.cpp @@ -0,0 +1,95 @@ +/* + * Copyright 2016 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#include "SkFlattenable.h" +#include "SkReadBuffer.h" +#include "SkWriteBuffer.h" +#include "Test.h" + +class IntFlattenable : public SkFlattenable { +public: + IntFlattenable(uint32_t a, uint32_t b, uint32_t c, uint32_t d) + : fA(a) + , fB(b) + , fC(c) + , fD(d) + {} + + void flatten(SkWriteBuffer& buffer) const override { + buffer.writeUInt(fA); + buffer.writeUInt(fB); + buffer.writeUInt(fC); + buffer.writeUInt(fD); + } + + Factory getFactory() const override { return nullptr; } + + uint32_t a() const { return fA; } + uint32_t b() const { return fB; } + uint32_t c() const { return fC; } + uint32_t d() const { return fD; } + + const char* getTypeName() const override { return "IntFlattenable"; } + +private: + uint32_t fA; + uint32_t fB; + uint32_t fC; + uint32_t fD; +}; + +static sk_sp<SkFlattenable> custom_create_proc(SkReadBuffer& buffer) { + uint32_t a = buffer.readUInt(); + uint32_t b = buffer.readUInt(); + uint32_t c = buffer.readUInt(); + uint32_t d = buffer.readUInt(); + return sk_sp<SkFlattenable>(new IntFlattenable(a + 1, b + 1, c + 1, d + 1)); +} + +DEF_TEST(UnflattenWithCustomFactory, r) { + // Create and flatten the test flattenable + SkWriteBuffer writeBuffer; + SkAutoTUnref<SkFlattenable> flattenable1(new IntFlattenable(1, 2, 3, 4)); + writeBuffer.writeFlattenable(flattenable1); + SkAutoTUnref<SkFlattenable> flattenable2(new IntFlattenable(2, 3, 4, 5)); + writeBuffer.writeFlattenable(flattenable2); + SkAutoTUnref<SkFlattenable> flattenable3(new IntFlattenable(3, 4, 5, 6)); + writeBuffer.writeFlattenable(flattenable3); + + // Copy the contents of the write buffer into a read buffer + sk_sp<SkData> data = SkData::MakeUninitialized(writeBuffer.bytesWritten()); + writeBuffer.writeToMemory(data->writable_data()); + SkReadBuffer readBuffer(data->data(), data->size()); + + // Register a custom factory with the read buffer + readBuffer.setCustomFactory(SkString("IntFlattenable"), &custom_create_proc); + + // Unflatten and verify the flattenables + SkAutoTUnref<IntFlattenable> out1((IntFlattenable*) readBuffer.readFlattenable( + SkFlattenable::kSkUnused_Type)); + REPORTER_ASSERT(r, out1); + REPORTER_ASSERT(r, 2 == out1->a()); + REPORTER_ASSERT(r, 3 == out1->b()); + REPORTER_ASSERT(r, 4 == out1->c()); + REPORTER_ASSERT(r, 5 == out1->d()); + + SkAutoTUnref<IntFlattenable> out2((IntFlattenable*) readBuffer.readFlattenable( + SkFlattenable::kSkUnused_Type)); + REPORTER_ASSERT(r, out2); + REPORTER_ASSERT(r, 3 == out2->a()); + REPORTER_ASSERT(r, 4 == out2->b()); + REPORTER_ASSERT(r, 5 == out2->c()); + REPORTER_ASSERT(r, 6 == out2->d()); + + SkAutoTUnref<IntFlattenable> out3((IntFlattenable*) readBuffer.readFlattenable( + SkFlattenable::kSkUnused_Type)); + REPORTER_ASSERT(r, out3); + REPORTER_ASSERT(r, 4 == out3->a()); + REPORTER_ASSERT(r, 5 == out3->b()); + REPORTER_ASSERT(r, 6 == out3->c()); + REPORTER_ASSERT(r, 7 == out3->d()); +} |