testPrinter.cpp (3198B)
1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- 2 * vim: set ts=8 sts=2 et sw=2 tw=80: 3 */ 4 /* This Source Code Form is subject to the terms of the Mozilla Public 5 * License, v. 2.0. If a copy of the MPL was not distributed with this 6 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 7 8 #include "js/Printer.h" // FixedBufferPrinter 9 10 #include "jsapi-tests/tests.h" 11 12 using namespace js; 13 14 struct TestBuffer { 15 const char ASCII_ACK = (char)6; 16 17 char* buffer; 18 size_t size; 19 20 // len is the buffer size, including terminating null 21 explicit TestBuffer(const size_t len) : buffer(new char[len + 3]), size(len) { 22 buffer[size] = ASCII_ACK; // to detect overflow 23 buffer[size + 1] = ASCII_ACK; 24 buffer[size + 2] = ASCII_ACK; 25 } 26 27 ~TestBuffer() { delete[] buffer; } 28 29 // test has written past the end of the buffer 30 bool hasOverflowed() { 31 return buffer[size] != ASCII_ACK || buffer[size + 1] != ASCII_ACK || 32 buffer[size + 2] != ASCII_ACK; 33 } 34 35 bool matches(const char* expected) { return strcmp(buffer, expected) == 0; } 36 }; 37 38 BEGIN_TEST(testFixedBufferPrinter) { 39 // empty buffer 40 { 41 TestBuffer actual(0); 42 FixedBufferPrinter fbp(actual.buffer, 0); 43 fbp.put("will not fit"); 44 CHECK(!actual.hasOverflowed()); 45 } 46 // buffer is initially null-terminated 47 { 48 TestBuffer actual(10); 49 // make sure the buffer is not null-terminated 50 memset(actual.buffer, '!', actual.size); 51 FixedBufferPrinter fbp(actual.buffer, 10); 52 CHECK(!actual.hasOverflowed()); 53 CHECK(actual.matches("")); 54 } 55 // one put that fits 56 { 57 TestBuffer actual(50); 58 FixedBufferPrinter fbp(actual.buffer, actual.size); 59 const char* expected = "expected string fits"; 60 fbp.put(expected); 61 CHECK(!actual.hasOverflowed()); 62 CHECK(actual.matches(expected)); 63 } 64 // unterminated string in put 65 { 66 TestBuffer actual(50); 67 FixedBufferPrinter fbp(actual.buffer, actual.size); 68 const char* expected = "okBAD"; 69 fbp.put(expected, 2); 70 CHECK(!actual.hasOverflowed()); 71 CHECK(actual.matches("ok")); 72 } 73 // one put that more than fills the buffer 74 { 75 TestBuffer actual(16); 76 FixedBufferPrinter fbp(actual.buffer, actual.size); 77 const char* expected = "expected string overflow"; 78 fbp.put(expected); 79 CHECK(!actual.hasOverflowed()); 80 CHECK(actual.matches("expected string")); 81 } 82 // maintains position over multiple puts that fit 83 { 84 TestBuffer actual(16); 85 FixedBufferPrinter fbp(actual.buffer, actual.size); 86 fbp.put("expected "); 87 fbp.put("string"); 88 CHECK(actual.matches("expected string")); 89 } 90 // multiple puts, last one more than fills the buffer 91 { 92 TestBuffer actual(9); 93 FixedBufferPrinter fbp(actual.buffer, actual.size); 94 fbp.put("expected"); 95 fbp.put("overflow"); 96 CHECK(!actual.hasOverflowed()); 97 CHECK(actual.matches("expected")); 98 } 99 // put after buffer is full doesn't overflow 100 { 101 TestBuffer actual(2); 102 FixedBufferPrinter fbp(actual.buffer, actual.size); 103 fbp.put("exp"); 104 fbp.put("overflow"); 105 CHECK(!actual.hasOverflowed()); 106 CHECK(actual.matches("e")); 107 } 108 109 return true; 110 } 111 END_TEST(testFixedBufferPrinter)