/* * tests/testing.h * * Unit test utility functions/definitions * * Copyright (C) 2023 Douglas Rumbaugh * Dong Xie * * Distributed under the Modified BSD License. * */ #pragma once #include #include #include #include #include #include "util/types.h" #include "psu-util/alignment.h" #include "framework/structure/MutableBuffer.h" #include "framework/interface/Record.h" typedef de::WeightedRecord WRec; typedef de::Record Rec; typedef de::EuclidPoint PRec; typedef de::Record StringRec; static std::string kjv_wordlist = "tests/data/kjv-wordlist.txt"; static std::string summa_wordlist = "tests/data/summa-wordlist.txt"; static std::vector> string_data; static std::vector read_string_data(std::string fname, size_t n) { std::vector vec; vec.reserve(n); string_data.reserve(n); std::fstream file; file.open(fname, std::ios::in); for (size_t i=0; i(c)); StringRec r(string_data[string_data.size() -1].get(), val, field.size()); vec.push_back(r); } return vec; } template std::vector strip_wrapping(std::vector> vec) { std::vector out(vec.size()); for (uint32_t i=0; i static de::MutableBuffer *create_test_mbuffer(size_t cnt) { auto buffer = new de::MutableBuffer(cnt/2, cnt); if constexpr (de::KVPInterface){ if constexpr (std::is_same_v){ auto records = read_string_data(kjv_wordlist, cnt); for (size_t i=0; iappend(records[i]); } } else { for (size_t i = 0; i < cnt; i++) { if constexpr (de::WeightedRecordInterface) { buffer->append({(uint64_t) rand(), (uint32_t) rand(), 1}); } else { buffer->append({(uint64_t) rand(), (uint32_t) rand()}); } } } } else if constexpr (de::NDRecordInterface) { for (size_t i=0; iappend({(uint64_t) rand(), (uint64_t) rand()}); } } return buffer; } template static de::MutableBuffer *create_sequential_mbuffer(size_t start, size_t stop) { size_t cnt = stop - start; auto buffer = new de::MutableBuffer(cnt/2, cnt); for (uint32_t i=start; i) { buffer->append({i, i, 1}); } else { buffer->append({i, i}); } } return buffer; } /* template static de::MutableBuffer *create_test_mbuffer_tombstones(size_t cnt, size_t ts_cnt) { auto buffer = new de::MutableBuffer(cnt/2, cnt); std::vector> tombstones; R rec; for (size_t i = 0; i < cnt; i++) { if constexpr (de::WeightedRecordInterface) { rec = {rand(), rand(), 1}; } else { rec = {rand(), rand(), 1}; } if (i < ts_cnt) { tombstones.push_back({rec.key, rec.value}); } buffer->append(rec); } rec.set_tombstone(); for (size_t i=0; iappend(rec); } return buffer; } */ template requires de::WeightedRecordInterface && de::KVPInterface static de::MutableBuffer *create_weighted_mbuffer(size_t cnt) { auto buffer = new de::MutableBuffer(cnt/2, cnt); // Put in half of the count with weight one. for (uint32_t i=0; i< cnt / 2; i++) { buffer->append(R {1, i, 2}); } // put in a quarter of the count with weight four. for (uint32_t i=0; i< cnt / 4; i++) { buffer->append(R {2, i, 4}); } // the remaining quarter with weight eight. for (uint32_t i=0; i< cnt / 4; i++) { buffer->append(R {3, i, 8}); } return buffer; } template static de::MutableBuffer *create_double_seq_mbuffer(size_t cnt, bool ts=false) { auto buffer = new de::MutableBuffer(cnt/2, cnt); for (uint32_t i = 0; i < cnt / 2; i++) { buffer->append({i, i}, ts); } for (uint32_t i = 0; i < cnt / 2; i++) { buffer->append({i, i+1}, ts); } return buffer; }