1
/****************************************************************************
3
** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
4
** Contact: http://www.qt-project.org/legal
6
** This file is part of the test suite of the Qt Toolkit.
8
** $QT_BEGIN_LICENSE:LGPL$
9
** Commercial License Usage
10
** Licensees holding valid commercial Qt licenses may use this file in
11
** accordance with the commercial license agreement provided with the
12
** Software or, alternatively, in accordance with the terms contained in
13
** a written agreement between you and Digia. For licensing terms and
14
** conditions see http://qt.digia.com/licensing. For further information
15
** use the contact form at http://qt.digia.com/contact-us.
17
** GNU Lesser General Public License Usage
18
** Alternatively, this file may be used under the terms of the GNU Lesser
19
** General Public License version 2.1 as published by the Free Software
20
** Foundation and appearing in the file LICENSE.LGPL included in the
21
** packaging of this file. Please review the following information to
22
** ensure the GNU Lesser General Public License version 2.1 requirements
23
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
25
** In addition, as a special exception, Digia gives you certain additional
26
** rights. These rights are described in the Digia Qt LGPL Exception
27
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
29
** GNU General Public License Usage
30
** Alternatively, this file may be used under the terms of the GNU
31
** General Public License version 3.0 as published by the Free Software
32
** Foundation and appearing in the file LICENSE.GPL included in the
33
** packaging of this file. Please review the following information to
34
** ensure the GNU General Public License version 3.0 requirements will be
35
** met: http://www.gnu.org/copyleft/gpl.html.
40
****************************************************************************/
42
#include <QtTest/QtTest>
43
#include <QtCore/QBuffer>
44
#include <QtCore/QDataStream>
46
#include "qbitarray.h"
49
* Helper function to initialize a bitarray from a string
51
static QBitArray QStringToQBitArray(const QString &str)
54
ba.resize(str.length());
57
for (i = 0; i < str.length(); i++)
67
class tst_QBitArray : public QObject
73
void countBits_data();
79
void toggleBit_data();
82
void operator_andeq_data();
83
void operator_andeq();
85
void operator_oreq_data();
88
void operator_xoreq_data();
89
void operator_xoreq();
91
void operator_neg_data();
93
void datastream_data();
95
void invertOnNull() const;
96
void operator_noteq_data();
97
void operator_noteq();
102
void tst_QBitArray::size_data()
104
//create the testtable instance and define the elements
105
QTest::addColumn<int>("count");
106
QTest::addColumn<QString>("res");
108
//next we fill it with data
109
QTest::newRow( "data0" ) << 1 << QString("1");
110
QTest::newRow( "data1" ) << 2 << QString("11");
111
QTest::newRow( "data2" ) << 3 << QString("111");
112
QTest::newRow( "data3" ) << 9 << QString("111111111");
113
QTest::newRow( "data4" ) << 10 << QString("1111111111");
114
QTest::newRow( "data5" ) << 17 << QString("11111111111111111");
115
QTest::newRow( "data6" ) << 18 << QString("111111111111111111");
116
QTest::newRow( "data7" ) << 19 << QString("1111111111111111111");
117
QTest::newRow( "data8" ) << 20 << QString("11111111111111111111");
118
QTest::newRow( "data9" ) << 21 << QString("111111111111111111111");
119
QTest::newRow( "data10" ) << 22 << QString("1111111111111111111111");
120
QTest::newRow( "data11" ) << 23 << QString("11111111111111111111111");
121
QTest::newRow( "data12" ) << 24 << QString("111111111111111111111111");
122
QTest::newRow( "data13" ) << 25 << QString("1111111111111111111111111");
123
QTest::newRow( "data14" ) << 32 << QString("11111111111111111111111111111111");
126
void tst_QBitArray::size()
134
for (int j=0; j<len; j++) {
144
void tst_QBitArray::countBits_data()
146
QTest::addColumn<QString>("bitField");
147
QTest::addColumn<int>("numBits");
148
QTest::addColumn<int>("onBits");
150
QTest::newRow("empty") << QString() << 0 << 0;
151
QTest::newRow("1") << QString("1") << 1 << 1;
152
QTest::newRow("101") << QString("101") << 3 << 2;
153
QTest::newRow("101100001") << QString("101100001") << 9 << 4;
154
QTest::newRow("101100001101100001") << QString("101100001101100001") << 18 << 8;
155
QTest::newRow("101100001101100001101100001101100001") << QString("101100001101100001101100001101100001") << 36 << 16;
156
QTest::newRow("00000000000000000000000000000000000") << QString("00000000000000000000000000000000000") << 35 << 0;
157
QTest::newRow("11111111111111111111111111111111111") << QString("11111111111111111111111111111111111") << 35 << 35;
158
QTest::newRow("11111111111111111111111111111111") << QString("11111111111111111111111111111111") << 32 << 32;
159
QTest::newRow("11111111111111111111111111111111111111111111111111111111")
160
<< QString("11111111111111111111111111111111111111111111111111111111") << 56 << 56;
161
QTest::newRow("00000000000000000000000000000000000") << QString("00000000000000000000000000000000000") << 35 << 0;
162
QTest::newRow("00000000000000000000000000000000") << QString("00000000000000000000000000000000") << 32 << 0;
163
QTest::newRow("00000000000000000000000000000000000000000000000000000000")
164
<< QString("00000000000000000000000000000000000000000000000000000000") << 56 << 0;
167
void tst_QBitArray::countBits()
169
QFETCH(QString, bitField);
170
QFETCH(int, numBits);
173
QBitArray bits(bitField.size());
174
for (int i = 0; i < bitField.size(); ++i) {
175
if (bitField.at(i) == QLatin1Char('1'))
179
QCOMPARE(bits.count(), numBits);
180
QCOMPARE(bits.count(true), onBits);
181
QCOMPARE(bits.count(false), numBits - onBits);
184
void tst_QBitArray::countBits2()
187
for (int i = 0; i < 4017; ++i) {
190
QCOMPARE(bitArray.count(true), i);
191
QCOMPARE(bitArray.count(false), 0);
192
bitArray.fill(false);
193
QCOMPARE(bitArray.count(true), 0);
194
QCOMPARE(bitArray.count(false), i);
198
void tst_QBitArray::isEmpty()
201
QVERIFY(a1.isEmpty());
202
QVERIFY(a1.isNull());
203
QVERIFY(a1.size() == 0);
205
QBitArray a2(0, true);
206
QVERIFY(a2.isEmpty());
207
QVERIFY(!a2.isNull());
208
QVERIFY(a2.size() == 0);
210
QBitArray a3(1, true);
211
QVERIFY(!a3.isEmpty());
212
QVERIFY(!a3.isNull());
213
QVERIFY(a3.size() == 1);
216
QVERIFY(a1.isEmpty());
217
QVERIFY(!a1.isNull());
218
QVERIFY(a1.size() == 0);
221
QVERIFY(a2.isEmpty());
222
QVERIFY(!a2.isNull());
223
QVERIFY(a2.size() == 0);
226
QVERIFY(!a1.isEmpty());
227
QVERIFY(!a1.isNull());
228
QVERIFY(a1.size() == 1);
231
QVERIFY(!a1.isEmpty());
232
QVERIFY(!a1.isNull());
233
QVERIFY(a1.size() == 2);
236
void tst_QBitArray::swap()
238
QBitArray b1 = QStringToQBitArray("1"), b2 = QStringToQBitArray("10");
240
QCOMPARE(b1,QStringToQBitArray("10"));
241
QCOMPARE(b2,QStringToQBitArray("1"));
244
void tst_QBitArray::fill()
248
QBitArray a(N, false);
251
for (i = 0; i < N-M; ++i) {
252
a.fill(true, i, i + M);
253
for (j = 0; j < N; ++j) {
254
if (j >= i && j < i + M) {
260
a.fill(false, i, i + M);
262
for (i = 0; i < N; ++i)
263
a.fill(i % 2 == 0, i, i + 1);
264
for (i = 0; i < N; ++i) {
265
QVERIFY(a.at(i) == (i % 2 == 0));
269
void tst_QBitArray::toggleBit_data()
271
QTest::addColumn<int>("index");
272
QTest::addColumn<QBitArray>("input");
273
QTest::addColumn<QBitArray>("res");
274
// 8 bits, toggle first bit
275
QTest::newRow( "data0" ) << 0 << QStringToQBitArray(QString("11111111")) << QStringToQBitArray(QString("01111111"));
277
QTest::newRow( "data1" ) << 1 << QStringToQBitArray(QString("11111111")) << QStringToQBitArray(QString("10111111"));
278
// 11 bits, toggle last bit
279
QTest::newRow( "data2" ) << 10 << QStringToQBitArray(QString("11111111111")) << QStringToQBitArray(QString("11111111110"));
283
void tst_QBitArray::toggleBit()
286
QFETCH(QBitArray, input);
287
QFETCH(QBitArray, res);
289
input.toggleBit(index);
291
QCOMPARE(input, res);
294
void tst_QBitArray::operator_andeq_data()
296
QTest::addColumn<QBitArray>("input1");
297
QTest::addColumn<QBitArray>("input2");
298
QTest::addColumn<QBitArray>("res");
300
QTest::newRow( "data0" ) << QStringToQBitArray(QString("11111111"))
301
<< QStringToQBitArray(QString("00101100"))
302
<< QStringToQBitArray(QString("00101100"));
305
QTest::newRow( "data1" ) << QStringToQBitArray(QString("11011011"))
306
<< QStringToQBitArray(QString("00101100"))
307
<< QStringToQBitArray(QString("00001000"));
309
QTest::newRow( "data2" ) << QStringToQBitArray(QString("11011011111"))
310
<< QStringToQBitArray(QString("00101100"))
311
<< QStringToQBitArray(QString("00001000000"));
313
QTest::newRow( "data3" ) << QStringToQBitArray(QString("11011011"))
314
<< QStringToQBitArray(QString("00101100111"))
315
<< QStringToQBitArray(QString("00001000000"));
317
QTest::newRow( "data4" ) << QStringToQBitArray(QString())
318
<< QStringToQBitArray(QString("00101100111"))
319
<< QStringToQBitArray(QString("00000000000"));
321
QTest::newRow( "data5" ) << QStringToQBitArray(QString("00101100111"))
322
<< QStringToQBitArray(QString())
323
<< QStringToQBitArray(QString("00000000000"));
325
QTest::newRow( "data6" ) << QStringToQBitArray(QString())
326
<< QStringToQBitArray(QString())
327
<< QStringToQBitArray(QString());
330
void tst_QBitArray::operator_andeq()
332
QFETCH(QBitArray, input1);
333
QFETCH(QBitArray, input2);
334
QFETCH(QBitArray, res);
338
QCOMPARE(input1, res);
341
void tst_QBitArray::operator_oreq_data()
343
QTest::addColumn<QBitArray>("input1");
344
QTest::addColumn<QBitArray>("input2");
345
QTest::addColumn<QBitArray>("res");
347
QTest::newRow( "data0" ) << QStringToQBitArray(QString("11111111"))
348
<< QStringToQBitArray(QString("00101100"))
349
<< QStringToQBitArray(QString("11111111"));
352
QTest::newRow( "data1" ) << QStringToQBitArray(QString("11011011"))
353
<< QStringToQBitArray(QString("00101100"))
354
<< QStringToQBitArray(QString("11111111"));
356
QTest::newRow( "data2" ) << QStringToQBitArray(QString("01000010"))
357
<< QStringToQBitArray(QString("10100001"))
358
<< QStringToQBitArray(QString("11100011"));
360
QTest::newRow( "data3" ) << QStringToQBitArray(QString("11011011"))
361
<< QStringToQBitArray(QString("00101100000"))
362
<< QStringToQBitArray(QString("11111111000"));
364
QTest::newRow( "data4" ) << QStringToQBitArray(QString("11011011111"))
365
<< QStringToQBitArray(QString("00101100"))
366
<< QStringToQBitArray(QString("11111111111"));
368
QTest::newRow( "data5" ) << QStringToQBitArray(QString())
369
<< QStringToQBitArray(QString("00101100111"))
370
<< QStringToQBitArray(QString("00101100111"));
372
QTest::newRow( "data6" ) << QStringToQBitArray(QString("00101100111"))
373
<< QStringToQBitArray(QString())
374
<< QStringToQBitArray(QString("00101100111"));
376
QTest::newRow( "data7" ) << QStringToQBitArray(QString())
377
<< QStringToQBitArray(QString())
378
<< QStringToQBitArray(QString());
381
void tst_QBitArray::operator_oreq()
383
QFETCH(QBitArray, input1);
384
QFETCH(QBitArray, input2);
385
QFETCH(QBitArray, res);
389
QCOMPARE(input1, res);
392
void tst_QBitArray::operator_xoreq_data()
394
QTest::addColumn<QBitArray>("input1");
395
QTest::addColumn<QBitArray>("input2");
396
QTest::addColumn<QBitArray>("res");
397
QTest::newRow( "data0" ) << QStringToQBitArray(QString("11111111"))
398
<< QStringToQBitArray(QString("00101100"))
399
<< QStringToQBitArray(QString("11010011"));
401
QTest::newRow( "data1" ) << QStringToQBitArray(QString("11011011"))
402
<< QStringToQBitArray(QString("00101100"))
403
<< QStringToQBitArray(QString("11110111"));
405
QTest::newRow( "data2" ) << QStringToQBitArray(QString("01000010"))
406
<< QStringToQBitArray(QString("10100001"))
407
<< QStringToQBitArray(QString("11100011"));
409
QTest::newRow( "data3" ) << QStringToQBitArray(QString("01000010"))
410
<< QStringToQBitArray(QString("10100001101"))
411
<< QStringToQBitArray(QString("11100011101"));
413
QTest::newRow( "data4" ) << QStringToQBitArray(QString("01000010111"))
414
<< QStringToQBitArray(QString("101000011"))
415
<< QStringToQBitArray(QString("11100011011"));
417
QTest::newRow( "data5" ) << QStringToQBitArray(QString())
418
<< QStringToQBitArray(QString("00101100111"))
419
<< QStringToQBitArray(QString("00101100111"));
421
QTest::newRow( "data6" ) << QStringToQBitArray(QString("00101100111"))
422
<< QStringToQBitArray(QString())
423
<< QStringToQBitArray(QString("00101100111"));
425
QTest::newRow( "data7" ) << QStringToQBitArray(QString())
426
<< QStringToQBitArray(QString())
427
<< QStringToQBitArray(QString());
430
void tst_QBitArray::operator_xoreq()
432
QFETCH(QBitArray, input1);
433
QFETCH(QBitArray, input2);
434
QFETCH(QBitArray, res);
438
QCOMPARE(input1, res);
442
void tst_QBitArray::operator_neg_data()
444
QTest::addColumn<QBitArray>("input");
445
QTest::addColumn<QBitArray>("res");
447
QTest::newRow( "data0" ) << QStringToQBitArray(QString("11111111"))
448
<< QStringToQBitArray(QString("00000000"));
450
QTest::newRow( "data1" ) << QStringToQBitArray(QString("11011011"))
451
<< QStringToQBitArray(QString("00100100"));
453
QTest::newRow( "data2" ) << QStringToQBitArray(QString("00000000"))
454
<< QStringToQBitArray(QString("11111111"));
456
QTest::newRow( "data3" ) << QStringToQBitArray(QString())
457
<< QStringToQBitArray(QString());
459
QTest::newRow( "data4" ) << QStringToQBitArray("1")
460
<< QStringToQBitArray("0");
462
QTest::newRow( "data5" ) << QStringToQBitArray("0")
463
<< QStringToQBitArray("1");
465
QTest::newRow( "data6" ) << QStringToQBitArray("01")
466
<< QStringToQBitArray("10");
468
QTest::newRow( "data7" ) << QStringToQBitArray("1110101")
469
<< QStringToQBitArray("0001010");
471
QTest::newRow( "data8" ) << QStringToQBitArray("01110101")
472
<< QStringToQBitArray("10001010");
474
QTest::newRow( "data9" ) << QStringToQBitArray("011101010")
475
<< QStringToQBitArray("100010101");
477
QTest::newRow( "data10" ) << QStringToQBitArray("0111010101111010")
478
<< QStringToQBitArray("1000101010000101");
481
void tst_QBitArray::operator_neg()
483
QFETCH(QBitArray, input);
484
QFETCH(QBitArray, res);
488
QCOMPARE(input, res);
491
void tst_QBitArray::datastream_data()
493
QTest::addColumn<QString>("bitField");
494
QTest::addColumn<int>("numBits");
495
QTest::addColumn<int>("onBits");
497
QTest::newRow("empty") << QString() << 0 << 0;
498
QTest::newRow("1") << QString("1") << 1 << 1;
499
QTest::newRow("101") << QString("101") << 3 << 2;
500
QTest::newRow("101100001") << QString("101100001") << 9 << 4;
501
QTest::newRow("101100001101100001") << QString("101100001101100001") << 18 << 8;
502
QTest::newRow("101100001101100001101100001101100001") << QString("101100001101100001101100001101100001") << 36 << 16;
503
QTest::newRow("00000000000000000000000000000000000") << QString("00000000000000000000000000000000000") << 35 << 0;
504
QTest::newRow("11111111111111111111111111111111111") << QString("11111111111111111111111111111111111") << 35 << 35;
505
QTest::newRow("11111111111111111111111111111111") << QString("11111111111111111111111111111111") << 32 << 32;
506
QTest::newRow("11111111111111111111111111111111111111111111111111111111")
507
<< QString("11111111111111111111111111111111111111111111111111111111") << 56 << 56;
508
QTest::newRow("00000000000000000000000000000000000") << QString("00000000000000000000000000000000000") << 35 << 0;
509
QTest::newRow("00000000000000000000000000000000") << QString("00000000000000000000000000000000") << 32 << 0;
510
QTest::newRow("00000000000000000000000000000000000000000000000000000000")
511
<< QString("00000000000000000000000000000000000000000000000000000000") << 56 << 0;
514
void tst_QBitArray::datastream()
516
QFETCH(QString, bitField);
517
QFETCH(int, numBits);
521
QVERIFY(buffer.open(QBuffer::ReadWrite));
522
QDataStream stream(&buffer);
524
QBitArray bits(bitField.size());
525
for (int i = 0; i < bitField.size(); ++i) {
526
if (bitField.at(i) == QLatin1Char('1'))
530
QCOMPARE(bits.count(), numBits);
531
QCOMPARE(bits.count(true), onBits);
532
QCOMPARE(bits.count(false), numBits - onBits);
534
stream << bits << bits << bits;
537
QCOMPARE(stream.status(), QDataStream::Ok);
539
QVERIFY(buffer.open(QBuffer::ReadWrite));
540
QDataStream stream2(&buffer);
542
QBitArray array1, array2, array3;
543
stream2 >> array1 >> array2 >> array3;
545
QCOMPARE(array1.count(), numBits);
546
QCOMPARE(array1.count(true), onBits);
547
QCOMPARE(array1.count(false), numBits - onBits);
549
QCOMPARE(array1, bits);
550
QCOMPARE(array2, bits);
551
QCOMPARE(array3, bits);
554
void tst_QBitArray::invertOnNull() const
557
QCOMPARE(a = ~a, QBitArray());
560
void tst_QBitArray::operator_noteq_data()
562
QTest::addColumn<QBitArray>("input1");
563
QTest::addColumn<QBitArray>("input2");
564
QTest::addColumn<bool>("res");
566
QTest::newRow("data0") << QStringToQBitArray(QString("11111111"))
567
<< QStringToQBitArray(QString("00101100"))
570
QTest::newRow("data1") << QStringToQBitArray(QString("11011011"))
571
<< QStringToQBitArray(QString("11011011"))
574
QTest::newRow("data2") << QStringToQBitArray(QString())
575
<< QStringToQBitArray(QString("00101100111"))
578
QTest::newRow("data3") << QStringToQBitArray(QString())
579
<< QStringToQBitArray(QString())
582
QTest::newRow("data4") << QStringToQBitArray(QString("00101100"))
583
<< QStringToQBitArray(QString("11111111"))
586
QTest::newRow("data5") << QStringToQBitArray(QString("00101100111"))
587
<< QStringToQBitArray(QString())
591
void tst_QBitArray::operator_noteq()
593
QFETCH(QBitArray, input1);
594
QFETCH(QBitArray, input2);
597
bool b = input1 != input2;
601
void tst_QBitArray::resize()
603
// -- check that a resize handles the bits correctly
604
QBitArray a = QStringToQBitArray(QString("11"));
606
QVERIFY(a.size() == 10);
607
QCOMPARE( a, QStringToQBitArray(QString("1100000000")) );
611
// now the bit in a should have been gone:
612
QCOMPARE( a, QStringToQBitArray(QString("110000000")) );
614
// grow the array back and check the new bit
616
QCOMPARE( a, QStringToQBitArray(QString("1100000000")) );
618
// other test with and
620
QBitArray b = QStringToQBitArray(QString("1111111111"));
622
QCOMPARE( b, QStringToQBitArray(QString("1100000000")) );
626
QTEST_APPLESS_MAIN(tst_QBitArray)
627
#include "tst_qbitarray.moc"