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
|
// Copyright (C) 2022 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
#pragma once
#include "../namespaces.h"
#include "qchar_generator.h"
#include "../utilities/semantics/generator_handler.h"
#include <catch.hpp>
#include <random>
#include <QString>
namespace QDOC_CATCH_GENERATORS_ROOT_NAMESPACE {
namespace QDOC_CATCH_GENERATORS_PRIVATE_NAMESPACE {
class QStringGenerator : public Catch::Generators::IGenerator<QString> {
public:
QStringGenerator(Catch::Generators::GeneratorWrapper<QChar>&& character_generator, qsizetype minimum_length, qsizetype maximum_length)
: character_generator{QDOC_CATCH_GENERATORS_UTILITIES_ABSOLUTE_NAMESPACE::handler(std::move(character_generator))},
random_engine{std::random_device{}()},
length_distribution{minimum_length, maximum_length},
current_string{}
{
assert(minimum_length >= 0);
assert(maximum_length >= 0);
assert(minimum_length <= maximum_length);
if (!next())
Catch::throw_exception("Not enough values to initialize the first string");
}
QString const& get() const override { return current_string; }
bool next() override {
qsizetype length{length_distribution(random_engine)};
current_string = QString();
for (qsizetype length_index{0}; length_index < length; ++length_index) {
if (!character_generator.next()) return false;
current_string += character_generator.get();
}
return true;
}
private:
Catch::Generators::GeneratorWrapper<QChar> character_generator;
std::mt19937 random_engine;
std::uniform_int_distribution<qsizetype> length_distribution;
QString current_string;
};
} // end QDOC_CATCH_GENERATORS_PRIVATE_NAMESPACE
/*!
* Returns a generator that generates elements of QString from
* some amount of elements taken from \a character_generator.
*
* The generated strings will have a length in the range
* [\a minimum_length, \a maximum_length].
*
* For compatibility with the Qt API, it is possible to provide
* negative bounds for the length. This is, nonetheless,
* considered an error such that the bounds should always be
* greater or equal to zero.
*
* It is similarly considered an error to have minimum_length <=
* maximum_length.
*
* The provided generator will generate elements until \a
* character_generator is exhausted.
*/
inline Catch::Generators::GeneratorWrapper<QString> string(Catch::Generators::GeneratorWrapper<QChar>&& character_generator, qsizetype minimum_length, qsizetype maximum_length) {
return Catch::Generators::GeneratorWrapper<QString>(std::unique_ptr<Catch::Generators::IGenerator<QString>>(new QDOC_CATCH_GENERATORS_PRIVATE_NAMESPACE::QStringGenerator(std::move(character_generator), minimum_length, maximum_length)));
}
/*!
* Returns an infinite generator whose elements are the empty
* QString.
*/
inline Catch::Generators::GeneratorWrapper<QString> empty_string() {
return Catch::Generators::GeneratorWrapper<QString>(std::unique_ptr<Catch::Generators::IGenerator<QString>>(new QDOC_CATCH_GENERATORS_PRIVATE_NAMESPACE::QStringGenerator(character(), 0, 0)));
}
} // end QDOC_CATCH_GENERATORS_ROOT_NAMESPACE
|