DescriptorTest.cpp 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. /*
  2. * Copyright 2019 Google Inc.
  3. *
  4. * Use of this source code is governed by a BSD-style license that can be
  5. * found in the LICENSE file.
  6. */
  7. #include "include/core/SkTypes.h"
  8. #include "src/core/SkDescriptor.h"
  9. #include "src/core/SkScalerContext.h"
  10. #include "tests/Test.h"
  11. #include <memory>
  12. class SkDescriptorTestHelper {
  13. public:
  14. static void SetLength(SkDescriptor* desc, size_t length) { desc->fLength = length; }
  15. };
  16. DEF_TEST(Descriptor_empty, r) {
  17. const size_t size = sizeof(SkDescriptor);
  18. auto desc = SkDescriptor::Alloc(size);
  19. desc->init();
  20. REPORTER_ASSERT(r, desc->isValid());
  21. REPORTER_ASSERT(r, desc->getLength() == size);
  22. }
  23. DEF_TEST(Descriptor_valid_simple, r) {
  24. const size_t size =
  25. sizeof(SkDescriptor) + sizeof(SkDescriptor::Entry) + sizeof(SkScalerContextRec);
  26. auto desc = SkDescriptor::Alloc(size);
  27. desc->init();
  28. SkScalerContextRec rec;
  29. desc->addEntry(kRec_SkDescriptorTag, sizeof(rec), &rec);
  30. REPORTER_ASSERT(r, desc->isValid());
  31. REPORTER_ASSERT(r, desc->getLength() == size);
  32. SkDescriptorTestHelper::SetLength(desc.get(), size - 4);
  33. REPORTER_ASSERT(r, !desc->isValid());
  34. }
  35. DEF_TEST(Descriptor_valid_simple_extra_space, r) {
  36. const size_t extra_space = 100;
  37. const size_t size =
  38. sizeof(SkDescriptor) + sizeof(SkDescriptor::Entry) + sizeof(SkScalerContextRec);
  39. auto desc = SkDescriptor::Alloc(size + extra_space);
  40. desc->init();
  41. SkScalerContextRec rec;
  42. desc->addEntry(kRec_SkDescriptorTag, sizeof(rec), &rec);
  43. REPORTER_ASSERT(r, desc->isValid());
  44. REPORTER_ASSERT(r, desc->getLength() == size);
  45. SkDescriptorTestHelper::SetLength(desc.get(), size - 4);
  46. REPORTER_ASSERT(r, !desc->isValid());
  47. }
  48. DEF_TEST(Descriptor_valid_more_tags, r) {
  49. const size_t effectSize = 16;
  50. const size_t testSize = 32;
  51. const size_t size = sizeof(SkDescriptor) + 3 * sizeof(SkDescriptor::Entry) +
  52. sizeof(SkScalerContextRec) + effectSize + testSize;
  53. auto desc = SkDescriptor::Alloc(size);
  54. desc->init();
  55. SkScalerContextRec rec;
  56. desc->addEntry(kRec_SkDescriptorTag, sizeof(rec), &rec);
  57. desc->addEntry(kEffects_SkDescriptorTag, effectSize, nullptr);
  58. desc->addEntry(SkSetFourByteTag('t', 'e', 's', 't'), testSize, nullptr);
  59. REPORTER_ASSERT(r, desc->isValid());
  60. REPORTER_ASSERT(r, desc->getLength() == size);
  61. SkDescriptorTestHelper::SetLength(desc.get(), size - 4);
  62. REPORTER_ASSERT(r, !desc->isValid());
  63. }
  64. DEF_TEST(Descriptor_invalid_rec_size, r) {
  65. const size_t size =
  66. sizeof(SkDescriptor) + sizeof(SkDescriptor::Entry) + sizeof(SkScalerContextRec) - 4;
  67. auto desc = SkDescriptor::Alloc(size);
  68. desc->init();
  69. SkScalerContextRec rec;
  70. desc->addEntry(kRec_SkDescriptorTag, sizeof(rec) - 4, &rec);
  71. REPORTER_ASSERT(r, desc->getLength() == size);
  72. REPORTER_ASSERT(r, !desc->isValid());
  73. }
  74. DEF_TEST(Descriptor_invalid_length, r) {
  75. const size_t size = sizeof(SkDescriptor) + sizeof(SkDescriptor::Entry);
  76. const size_t effect_size = 1000;
  77. auto desc = SkDescriptor::Alloc(size);
  78. desc->init();
  79. SkScalerContextRec rec;
  80. desc->addEntry(kEffects_SkDescriptorTag, effect_size, nullptr);
  81. SkDescriptorTestHelper::SetLength(desc.get(), size);
  82. REPORTER_ASSERT(r, !desc->isValid());
  83. SkDescriptorTestHelper::SetLength(desc.get(), size + effect_size);
  84. REPORTER_ASSERT(r, desc->isValid());
  85. }