/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ #include #include #include #include #include namespace datasketches { using ebpps_test_sketch = ebpps_sketch>; using alloc = test_allocator; TEST_CASE("ebpps allocation test", "[ebpps_sketch][test_type]") { test_allocator_total_bytes = 0; test_allocator_net_allocations = 0; { ebpps_test_sketch sk1(10, 0); for (int i = 0; i < 100; ++i) sk1.update(i); auto bytes1 = sk1.serialize(0, test_type_serde()); auto sk2 = ebpps_test_sketch::deserialize(bytes1.data(), bytes1.size(), test_type_serde(), 0); std::stringstream ss; sk1.serialize(ss, test_type_serde()); auto sk3 = ebpps_test_sketch::deserialize(ss, test_type_serde(), alloc(0)); sk1.merge(sk2); // same size into sk1 sk3.merge(sk1); // larger into sk3 auto bytes2 = sk1.serialize(0, test_type_serde()); auto sk4 = ebpps_test_sketch::deserialize(bytes2.data(), bytes2.size(), test_type_serde(), 0); } REQUIRE(test_allocator_total_bytes == 0); REQUIRE(test_allocator_net_allocations == 0); } TEST_CASE( "ebpps merge", "[ebpps_sketch][test_type]") { test_allocator_total_bytes = 0; test_allocator_net_allocations = 0; { uint32_t n = 20; uint32_t k = 5; ebpps_test_sketch sk1(k, 0); ebpps_test_sketch sk2(k, 0); // move udpates for (int i = 0; i < (int) n; ++i) { sk1.update(i); sk2.update(-i); sk1.update(n + i); // sk1 heavier than sk2 } REQUIRE(sk1.get_n() == 2 * n); REQUIRE(sk2.get_n() == n); // move merge -- lighter into heavier sk1.merge(std::move(sk2)); REQUIRE(sk1.get_n() == 3 * n); // move constructor ebpps_test_sketch sk3(std::move(sk1)); REQUIRE(sk3.get_n() == 3 * n); // move assignment ebpps_test_sketch sk4(k, 0); sk4 = std::move(sk2); REQUIRE(sk4.get_n() == n); // move merge -- heavier into lighter sk4.merge(sk3); REQUIRE(sk4.get_n() == 4 * n); } REQUIRE(test_allocator_total_bytes == 0); REQUIRE(test_allocator_net_allocations == 0); } }