File: test062.cxx

package info (click to toggle)
libpqxx 4.0.1%2Bdfsg3-8
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 16,012 kB
  • ctags: 9,469
  • sloc: sh: 11,289; cpp: 10,801; xml: 1,256; makefile: 287; ansic: 195; python: 159
file content (104 lines) | stat: -rw-r--r-- 2,932 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#include <cstring>
#include <iostream>

#include "test_helpers.hxx"


using namespace PGSTD;
using namespace pqxx;


// Example program for libpqxx.  Test binarystring functionality.
namespace
{
void test_062(transaction_base &T)
{
  const string TestStr =
	"Nasty\n\030Test\n\t String with \200\277 weird bytes "
	"\r\0 and Trailer\\\\\0";

  T.exec("CREATE TEMP TABLE pqxxbin (binfield bytea)");

  const string Esc = T.esc_raw(TestStr),
	Chk = T.esc_raw(reinterpret_cast<const unsigned char *>(TestStr.c_str()),
                      strlen(TestStr.c_str()));

  PQXX_CHECK_EQUAL(Chk, Esc, "Inconsistent results from esc_raw().");

  T.exec("INSERT INTO pqxxbin VALUES ('" + Esc + "')");

  result R = T.exec("SELECT * from pqxxbin");
  T.exec("DELETE FROM pqxxbin");

  binarystring B( R.at(0).at(0) );

  PQXX_CHECK(!B.empty(), "Binary string became empty in conversion.");

  PQXX_CHECK_EQUAL(B.size(), TestStr.size(), "Binary string was mangled.");

  binarystring::const_iterator c;
  binarystring::size_type i;
  for (i=0, c=B.begin(); i<B.size(); ++i, ++c)
  {
    PQXX_CHECK(c != B.end(), "Premature end to binary string.");

    const char x = TestStr.at(i), y = char(B.at(i)), z = char(B.data()[i]);

    PQXX_CHECK_EQUAL(
	string(&x, 1),
	string(&y, 1),
	"Binary string byte changed.");

    PQXX_CHECK_EQUAL(
	string(&y, 1),
	string(&z, 1),
	"Inconsistent byte at offset " + to_string(i) + ".");
  }

  PQXX_CHECK(B.at(0) == B.front(), "front() is inconsistent with at(0).");
  PQXX_CHECK(c == B.end(), "end() of binary string not reached.");

  --c;

  PQXX_CHECK(*c == B.back(), "binarystring::back() is broken.");

#ifdef PQXX_HAVE_REVERSE_ITERATOR
  binarystring::const_reverse_iterator r;
  for (i=B.length(), r=B.rbegin(); i>0; --i, ++r)
  {
    PQXX_CHECK(
	r != B.rend(),
	"Premature rend to binary string at " + to_string(i) + ".");

    typedef unsigned char uchar;
    PQXX_CHECK_EQUAL(
	int(B[i-1]),
	int(uchar(TestStr.at(i-1))),
	"Reverse iterator is broken.");
  }
  PQXX_CHECK(r == B.rend(), "rend() of binary string not reached.");
#endif

  PQXX_CHECK_EQUAL(B.str(), TestStr, "Binary string was mangled.");

  const string TestStr2("(More conventional text)");
  T.exec("INSERT INTO pqxxbin VALUES ('" + TestStr2 + "')");
  R = T.exec("SELECT * FROM pqxxbin");
  binarystring B2(R.front().front());

  PQXX_CHECK(!(B2 == B), "False positive on binarystring::operator==().");
  PQXX_CHECK(B2 != B, "False negative on binarystring::operator!=().");

  binarystring B1c(B), B2c(B2);
  PQXX_CHECK(!(B1c != B), "Copied binarystring differs from original.");
  PQXX_CHECK(B2c == B2, "Copied binarystring not equal to original.");

  B1c.swap(B2c);

  PQXX_CHECK(B2c != B1c, "binarystring::swap() produced identical strings.");
  PQXX_CHECK(B2c == B, "binarystring::swap() is broken.");
  PQXX_CHECK(B1c == B2, "Cross-check of swapped binarystrings failed.");
}
} // namespace

PQXX_REGISTER_TEST(test_062)