Path: blob/master/tests/core/templates/test_vector.h
10278 views
/**************************************************************************/1/* test_vector.h */2/**************************************************************************/3/* This file is part of: */4/* GODOT ENGINE */5/* https://godotengine.org */6/**************************************************************************/7/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */8/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */9/* */10/* Permission is hereby granted, free of charge, to any person obtaining */11/* a copy of this software and associated documentation files (the */12/* "Software"), to deal in the Software without restriction, including */13/* without limitation the rights to use, copy, modify, merge, publish, */14/* distribute, sublicense, and/or sell copies of the Software, and to */15/* permit persons to whom the Software is furnished to do so, subject to */16/* the following conditions: */17/* */18/* The above copyright notice and this permission notice shall be */19/* included in all copies or substantial portions of the Software. */20/* */21/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */22/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */23/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */24/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */25/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */26/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */27/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */28/**************************************************************************/2930#pragma once3132#include "core/templates/vector.h"3334#include "tests/test_macros.h"3536namespace TestVector {3738TEST_CASE("[Vector] List initialization") {39Vector<int> vector{ 0, 1, 2, 3, 4 };4041CHECK(vector.size() == 5);42CHECK(vector[0] == 0);43CHECK(vector[1] == 1);44CHECK(vector[2] == 2);45CHECK(vector[3] == 3);46CHECK(vector[4] == 4);47}4849TEST_CASE("[Vector] Push back and append") {50Vector<int> vector;51vector.push_back(0);52vector.push_back(1);53vector.push_back(2);54vector.push_back(3);55// Alias for `push_back`.56vector.append(4);5758CHECK(vector[0] == 0);59CHECK(vector[1] == 1);60CHECK(vector[2] == 2);61CHECK(vector[3] == 3);62CHECK(vector[4] == 4);63}6465TEST_CASE("[Vector] Append array") {66Vector<int> vector;67vector.push_back(1);68vector.push_back(2);6970Vector<int> vector_other;71vector_other.push_back(128);72vector_other.push_back(129);73vector.append_array(vector_other);7475CHECK(vector.size() == 4);76CHECK(vector[0] == 1);77CHECK(vector[1] == 2);78CHECK(vector[2] == 128);79CHECK(vector[3] == 129);80}8182TEST_CASE("[Vector] Insert") {83Vector<int> vector;84vector.insert(0, 2);85vector.insert(0, 8);86vector.insert(2, 5);87vector.insert(1, 5);88vector.insert(0, -2);8990CHECK(vector.size() == 5);91CHECK(vector[0] == -2);92CHECK(vector[1] == 8);93CHECK(vector[2] == 5);94CHECK(vector[3] == 2);95CHECK(vector[4] == 5);96}9798TEST_CASE("[Vector] Ordered insert") {99Vector<int> vector;100vector.ordered_insert(2);101vector.ordered_insert(8);102vector.ordered_insert(5);103vector.ordered_insert(5);104vector.ordered_insert(-2);105106CHECK(vector.size() == 5);107CHECK(vector[0] == -2);108CHECK(vector[1] == 2);109CHECK(vector[2] == 5);110CHECK(vector[3] == 5);111CHECK(vector[4] == 8);112}113114TEST_CASE("[Vector] Insert + Ordered insert") {115Vector<int> vector;116vector.ordered_insert(2);117vector.ordered_insert(8);118vector.insert(0, 5);119vector.ordered_insert(5);120vector.insert(1, -2);121122CHECK(vector.size() == 5);123CHECK(vector[0] == 5);124CHECK(vector[1] == -2);125CHECK(vector[2] == 2);126CHECK(vector[3] == 5);127CHECK(vector[4] == 8);128}129130TEST_CASE("[Vector] Fill large array and modify it") {131Vector<int> vector;132vector.resize(1'000'000);133vector.fill(0x60d07);134135vector.write[200] = 0;136CHECK(vector.size() == 1'000'000);137CHECK(vector[0] == 0x60d07);138CHECK(vector[200] == 0);139CHECK(vector[499'999] == 0x60d07);140CHECK(vector[999'999] == 0x60d07);141vector.remove_at(200);142CHECK(vector[200] == 0x60d07);143144vector.clear();145CHECK(vector.size() == 0);146}147148TEST_CASE("[Vector] Copy creation") {149Vector<int> vector;150vector.push_back(0);151vector.push_back(1);152vector.push_back(2);153vector.push_back(3);154vector.push_back(4);155156Vector<int> vector_other = Vector<int>(vector);157vector_other.remove_at(0);158CHECK(vector_other[0] == 1);159CHECK(vector_other[1] == 2);160CHECK(vector_other[2] == 3);161CHECK(vector_other[3] == 4);162163// Make sure the original vector isn't modified.164CHECK(vector[0] == 0);165CHECK(vector[1] == 1);166CHECK(vector[2] == 2);167CHECK(vector[3] == 3);168CHECK(vector[4] == 4);169}170171TEST_CASE("[Vector] Duplicate") {172Vector<int> vector;173vector.push_back(0);174vector.push_back(1);175vector.push_back(2);176vector.push_back(3);177vector.push_back(4);178179Vector<int> vector_other = vector.duplicate();180vector_other.remove_at(0);181CHECK(vector_other[0] == 1);182CHECK(vector_other[1] == 2);183CHECK(vector_other[2] == 3);184CHECK(vector_other[3] == 4);185186// Make sure the original vector isn't modified.187CHECK(vector[0] == 0);188CHECK(vector[1] == 1);189CHECK(vector[2] == 2);190CHECK(vector[3] == 3);191CHECK(vector[4] == 4);192}193194TEST_CASE("[Vector] Get, set") {195Vector<int> vector;196vector.push_back(0);197vector.push_back(1);198vector.push_back(2);199vector.push_back(3);200vector.push_back(4);201202CHECK(vector.get(0) == 0);203CHECK(vector.get(1) == 1);204vector.set(2, 256);205CHECK(vector.get(2) == 256);206CHECK(vector.get(3) == 3);207208ERR_PRINT_OFF;209// Invalid (but should not crash): setting out of bounds.210vector.set(6, 500);211ERR_PRINT_ON;212213CHECK(vector.get(4) == 4);214}215216TEST_CASE("[Vector] To byte array (variant call)") {217// PackedInt32Array.218{219PackedInt32Array vector[] = { { 0, -1, 2008 }, {} };220PackedByteArray out[] = { { /* 0 */ 0x00, 0x00, 0x00, 0x00, /* -1 */ 0xFF, 0xFF, 0xFF, 0xFF, /* 2008 */ 0xD8, 0x07, 0x00, 0x00 }, {} };221222for (size_t i = 0; i < std::size(vector); i++) {223Callable::CallError err;224Variant v_ret;225Variant v_vector = vector[i];226v_vector.callp("to_byte_array", nullptr, 0, v_ret, err);227CHECK(v_ret.get_type() == Variant::PACKED_BYTE_ARRAY);228CHECK(v_ret.operator PackedByteArray() == out[i]);229}230}231232// PackedInt64Array.233{234PackedInt64Array vector[] = { { 0, -1, 2008 }, {} };235PackedByteArray out[] = { { /* 0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* -1 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 2008 */ 0xD8, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, {} };236237for (size_t i = 0; i < std::size(vector); i++) {238Callable::CallError err;239Variant v_ret;240Variant v_vector = vector[i];241v_vector.callp("to_byte_array", nullptr, 0, v_ret, err);242CHECK(v_ret.get_type() == Variant::PACKED_BYTE_ARRAY);243CHECK(v_ret.operator PackedByteArray() == out[i]);244}245}246247// PackedFloat32Array.248{249PackedFloat32Array vector[] = { { 0.0, -1.0, 200e24 }, {} };250PackedByteArray out[] = { { /* 0.0 */ 0x00, 0x00, 0x00, 0x00, /* -1.0 */ 0x00, 0x00, 0x80, 0xBF, /* 200e24 */ 0xA6, 0x6F, 0x25, 0x6B }, {} };251252for (size_t i = 0; i < std::size(vector); i++) {253Callable::CallError err;254Variant v_ret;255Variant v_vector = vector[i];256v_vector.callp("to_byte_array", nullptr, 0, v_ret, err);257CHECK(v_ret.get_type() == Variant::PACKED_BYTE_ARRAY);258CHECK(v_ret.operator PackedByteArray() == out[i]);259}260}261// PackedFloat64Array.262{263PackedFloat64Array vector[] = { { 0.0, -1.0, 200e24 }, {} };264PackedByteArray out[] = { { /* 0.0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* -1.0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xBF, /* 200e24 */ 0x35, 0x03, 0x32, 0xB7, 0xF4, 0xAD, 0x64, 0x45 }, {} };265266for (size_t i = 0; i < std::size(vector); i++) {267Callable::CallError err;268Variant v_ret;269Variant v_vector = vector[i];270v_vector.callp("to_byte_array", nullptr, 0, v_ret, err);271CHECK(v_ret.get_type() == Variant::PACKED_BYTE_ARRAY);272CHECK(v_ret.operator PackedByteArray() == out[i]);273}274}275276// PackedStringArray.277{278PackedStringArray vector[] = { { "test", "string" }, {}, { "", "test" } };279PackedByteArray out[] = { { /* test */ 0x74, 0x65, 0x73, 0x74, /* null */ 0x00, /* string */ 0x73, 0x74, 0x72, 0x69, 0x6E, 0x67, /* null */ 0x00 }, {}, { /* null */ 0x00, /* test */ 0x74, 0x65, 0x73, 0x74, /* null */ 0x00 } };280281for (size_t i = 0; i < std::size(vector); i++) {282Callable::CallError err;283Variant v_ret;284Variant v_vector = vector[i];285v_vector.callp("to_byte_array", nullptr, 0, v_ret, err);286CHECK(v_ret.get_type() == Variant::PACKED_BYTE_ARRAY);287CHECK(v_ret.operator PackedByteArray() == out[i]);288}289}290291// PackedVector2Array.292{293PackedVector2Array vector[] = { { Vector2(), Vector2(1, -1) }, {} };294#ifdef REAL_T_IS_DOUBLE295PackedByteArray out[] = { { /* X=0.0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* Y=0.0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* X=1.0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x3F, /* Y=-1.0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xBF }, {} };296#else297PackedByteArray out[] = { { /* X=0.0 */ 0x00, 0x00, 0x00, 0x00, /* Y=0.0 */ 0x00, 0x00, 0x00, 0x00, /* X=1.0 */ 0x00, 0x00, 0x80, 0x3F, /* Y=-1.0 */ 0x00, 0x00, 0x80, 0xBF }, {} };298#endif299300for (size_t i = 0; i < std::size(vector); i++) {301Callable::CallError err;302Variant v_ret;303Variant v_vector = vector[i];304v_vector.callp("to_byte_array", nullptr, 0, v_ret, err);305CHECK(v_ret.get_type() == Variant::PACKED_BYTE_ARRAY);306CHECK(v_ret.operator PackedByteArray() == out[i]);307}308}309310// PackedVector3Array.311{312PackedVector3Array vector[] = { { Vector3(), Vector3(1, 1, -1) }, {} };313#ifdef REAL_T_IS_DOUBLE314PackedByteArray out[] = { { /* X=0.0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* Y=0.0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* Z=0.0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* X=1.0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x3F, /* Y=1.0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x3F, /* Z=-1.0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xBF }, {} };315#else316PackedByteArray out[] = { { /* X=0.0 */ 0x00, 0x00, 0x00, 0x00, /* Y=0.0 */ 0x00, 0x00, 0x00, 0x00, /* Z=0.0 */ 0x00, 0x00, 0x00, 0x00, /* X=1.0 */ 0x00, 0x00, 0x80, 0x3F, /* Y=1.0 */ 0x00, 0x00, 0x80, 0x3F, /* Z=-1.0 */ 0x00, 0x00, 0x80, 0xBF }, {} };317#endif318319for (size_t i = 0; i < std::size(vector); i++) {320Callable::CallError err;321Variant v_ret;322Variant v_vector = vector[i];323v_vector.callp("to_byte_array", nullptr, 0, v_ret, err);324CHECK(v_ret.get_type() == Variant::PACKED_BYTE_ARRAY);325CHECK(v_ret.operator PackedByteArray() == out[i]);326}327}328329// PackedColorArray.330{331PackedColorArray vector[] = { { Color(), Color(1, 1, 1) }, {} };332PackedByteArray out[] = { { /* R=0.0 */ 0x00, 0x00, 0x00, 0x00, /* G=0.0 */ 0x00, 0x00, 0x00, 0x00, /* B=0.0 */ 0x00, 0x00, 0x00, 0x00, /* A=1.0 */ 0x00, 0x00, 0x80, 0x3F, /* R=1.0 */ 0x00, 0x00, 0x80, 0x3F, /* G=1.0 */ 0x00, 0x00, 0x80, 0x3F, /* B=1.0 */ 0x00, 0x00, 0x80, 0x3F, /* A=1.0 */ 0x00, 0x00, 0x80, 0x3F }, {} };333334for (size_t i = 0; i < std::size(vector); i++) {335Callable::CallError err;336Variant v_ret;337Variant v_vector = vector[i];338v_vector.callp("to_byte_array", nullptr, 0, v_ret, err);339CHECK(v_ret.get_type() == Variant::PACKED_BYTE_ARRAY);340CHECK(v_ret.operator PackedByteArray() == out[i]);341}342}343344// PackedVector4Array.345{346PackedVector4Array vector[] = { { Vector4(), Vector4(1, -1, 1, -1) }, {} };347#ifdef REAL_T_IS_DOUBLE348PackedByteArray out[] = { { /* X=0.0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* Y=0.0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* Z 0.0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* W=0.0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* X=1.0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x3F, /* Y=-1.0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xBF, /* Z=1.0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x3F, /* W=-1.0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xBF }, {} };349#else350PackedByteArray out[] = { { /* X=0.0 */ 0x00, 0x00, 0x00, 0x00, /* Y=0.0 */ 0x00, 0x00, 0x00, 0x00, /* Z=0.0 */ 0x00, 0x00, 0x00, 0x00, /* W 0.0 */ 0x00, 0x00, 0x00, 0x00, /* X 1.0 */ 0x00, 0x00, 0x80, 0x3F, /* Y=-1.0 */ 0x00, 0x00, 0x80, 0xBF, /* Z=1.0 */ 0x00, 0x00, 0x80, 0x3F, /* W=-1.0 */ 0x00, 0x00, 0x80, 0xBF }, {} };351#endif352353for (size_t i = 0; i < std::size(vector); i++) {354Callable::CallError err;355Variant v_ret;356Variant v_vector = vector[i];357v_vector.callp("to_byte_array", nullptr, 0, v_ret, err);358CHECK(v_ret.get_type() == Variant::PACKED_BYTE_ARRAY);359CHECK(v_ret.operator PackedByteArray() == out[i]);360}361}362}363364TEST_CASE("[Vector] To byte array") {365Vector<int> vector;366vector.push_back(0);367vector.push_back(-1);368vector.push_back(2008);369vector.push_back(999999999);370371Vector<uint8_t> byte_array = vector.to_byte_array();372CHECK(byte_array.size() == 16);373// vector[0]374CHECK(byte_array[0] == 0);375CHECK(byte_array[1] == 0);376CHECK(byte_array[2] == 0);377CHECK(byte_array[3] == 0);378379// vector[1]380CHECK(byte_array[4] == 255);381CHECK(byte_array[5] == 255);382CHECK(byte_array[6] == 255);383CHECK(byte_array[7] == 255);384385// vector[2]386CHECK(byte_array[8] == 216);387CHECK(byte_array[9] == 7);388CHECK(byte_array[10] == 0);389CHECK(byte_array[11] == 0);390391// vector[3]392CHECK(byte_array[12] == 255);393CHECK(byte_array[13] == 201);394CHECK(byte_array[14] == 154);395CHECK(byte_array[15] == 59);396}397398TEST_CASE("[Vector] Slice") {399Vector<int> vector;400vector.push_back(0);401vector.push_back(1);402vector.push_back(2);403vector.push_back(3);404vector.push_back(4);405406Vector<int> slice0 = vector.slice(0, 0);407CHECK(slice0.size() == 0);408409Vector<int> slice1 = vector.slice(1, 3);410CHECK(slice1.size() == 2);411CHECK(slice1[0] == 1);412CHECK(slice1[1] == 2);413414Vector<int> slice2 = vector.slice(1, -1);415CHECK(slice2.size() == 3);416CHECK(slice2[0] == 1);417CHECK(slice2[1] == 2);418CHECK(slice2[2] == 3);419420Vector<int> slice3 = vector.slice(3);421CHECK(slice3.size() == 2);422CHECK(slice3[0] == 3);423CHECK(slice3[1] == 4);424425Vector<int> slice4 = vector.slice(2, -2);426CHECK(slice4.size() == 1);427CHECK(slice4[0] == 2);428429Vector<int> slice5 = vector.slice(-2);430CHECK(slice5.size() == 2);431CHECK(slice5[0] == 3);432CHECK(slice5[1] == 4);433434Vector<int> slice6 = vector.slice(2, 42);435CHECK(slice6.size() == 3);436CHECK(slice6[0] == 2);437CHECK(slice6[1] == 3);438CHECK(slice6[2] == 4);439440ERR_PRINT_OFF;441Vector<int> slice7 = vector.slice(5, 1);442CHECK(slice7.size() == 0); // Expected to fail.443ERR_PRINT_ON;444}445446TEST_CASE("[Vector] Find, has") {447Vector<int> vector;448vector.push_back(3);449vector.push_back(1);450vector.push_back(4);451vector.push_back(0);452vector.push_back(2);453454CHECK(vector[0] == 3);455CHECK(vector[1] == 1);456CHECK(vector[2] == 4);457CHECK(vector[3] == 0);458CHECK(vector[4] == 2);459460CHECK(vector.find(0) == 3);461CHECK(vector.find(1) == 1);462CHECK(vector.find(2) == 4);463CHECK(vector.find(3) == 0);464CHECK(vector.find(4) == 2);465466CHECK(vector.find(-1) == -1);467CHECK(vector.find(5) == -1);468469CHECK(vector.has(0));470CHECK(vector.has(1));471CHECK(vector.has(2));472CHECK(vector.has(3));473CHECK(vector.has(4));474475CHECK(!vector.has(-1));476CHECK(!vector.has(5));477}478479TEST_CASE("[Vector] Remove at") {480Vector<int> vector;481vector.push_back(0);482vector.push_back(1);483vector.push_back(2);484vector.push_back(3);485vector.push_back(4);486487vector.remove_at(0);488489CHECK(vector[0] == 1);490CHECK(vector[1] == 2);491CHECK(vector[2] == 3);492CHECK(vector[3] == 4);493494vector.remove_at(2);495496CHECK(vector[0] == 1);497CHECK(vector[1] == 2);498CHECK(vector[2] == 4);499500vector.remove_at(1);501502CHECK(vector[0] == 1);503CHECK(vector[1] == 4);504505vector.remove_at(0);506507CHECK(vector[0] == 4);508}509510TEST_CASE("[Vector] Remove at and find") {511Vector<int> vector;512vector.push_back(0);513vector.push_back(1);514vector.push_back(2);515vector.push_back(3);516vector.push_back(4);517518CHECK(vector.size() == 5);519520vector.remove_at(0);521522CHECK(vector.size() == 4);523524CHECK(vector.find(0) == -1);525CHECK(vector.find(1) != -1);526CHECK(vector.find(2) != -1);527CHECK(vector.find(3) != -1);528CHECK(vector.find(4) != -1);529530vector.remove_at(vector.find(3));531532CHECK(vector.size() == 3);533534CHECK(vector.find(3) == -1);535CHECK(vector.find(1) != -1);536CHECK(vector.find(2) != -1);537CHECK(vector.find(4) != -1);538539vector.remove_at(vector.find(2));540541CHECK(vector.size() == 2);542543CHECK(vector.find(2) == -1);544CHECK(vector.find(1) != -1);545CHECK(vector.find(4) != -1);546547vector.remove_at(vector.find(4));548549CHECK(vector.size() == 1);550551CHECK(vector.find(4) == -1);552CHECK(vector.find(1) != -1);553554vector.remove_at(0);555556CHECK(vector.is_empty());557CHECK(vector.size() == 0);558}559560TEST_CASE("[Vector] Erase") {561Vector<int> vector;562vector.push_back(1);563vector.push_back(3);564vector.push_back(0);565vector.push_back(2);566vector.push_back(4);567568CHECK(vector.find(2) == 3);569570vector.erase(2);571572CHECK(vector.find(2) == -1);573CHECK(vector.size() == 4);574}575576TEST_CASE("[Vector] Size, resize, reserve") {577Vector<int> vector;578CHECK(vector.is_empty());579CHECK(vector.size() == 0);580581vector.resize(10);582583CHECK(vector.size() == 10);584585vector.resize(5);586587CHECK(vector.size() == 5);588589vector.remove_at(0);590vector.remove_at(0);591vector.remove_at(0);592593CHECK(vector.size() == 2);594595vector.clear();596597CHECK(vector.size() == 0);598CHECK(vector.is_empty());599600vector.push_back(0);601vector.push_back(0);602vector.push_back(0);603604CHECK(vector.size() == 3);605606vector.push_back(0);607608CHECK(vector.size() == 4);609}610611TEST_CASE("[Vector] Sort") {612Vector<int> vector;613vector.push_back(2);614vector.push_back(8);615vector.push_back(-4);616vector.push_back(5);617vector.sort();618619CHECK(vector.size() == 4);620CHECK(vector[0] == -4);621CHECK(vector[1] == 2);622CHECK(vector[2] == 5);623CHECK(vector[3] == 8);624}625626TEST_CASE("[Vector] Sort custom") {627Vector<String> vector;628vector.push_back("world");629vector.push_back("World");630vector.push_back("Hello");631vector.push_back("10Hello");632vector.push_back("12Hello");633vector.push_back("01Hello");634vector.push_back("1Hello");635vector.push_back(".Hello");636vector.sort_custom<NaturalNoCaseComparator>();637638CHECK(vector.size() == 8);639CHECK(vector[0] == ".Hello");640CHECK(vector[1] == "01Hello");641CHECK(vector[2] == "1Hello");642CHECK(vector[3] == "10Hello");643CHECK(vector[4] == "12Hello");644CHECK(vector[5] == "Hello");645CHECK(vector[6] == "world");646CHECK(vector[7] == "World");647}648649TEST_CASE("[Vector] Search") {650Vector<int> vector;651vector.push_back(1);652vector.push_back(2);653vector.push_back(3);654vector.push_back(5);655vector.push_back(8);656CHECK(vector.bsearch(2, true) == 1);657CHECK(vector.bsearch(2, false) == 2);658CHECK(vector.bsearch(5, true) == 3);659CHECK(vector.bsearch(5, false) == 4);660}661662TEST_CASE("[Vector] Operators") {663Vector<int> vector;664vector.push_back(2);665vector.push_back(8);666vector.push_back(-4);667vector.push_back(5);668669Vector<int> vector_other;670vector_other.push_back(2);671vector_other.push_back(8);672vector_other.push_back(-4);673vector_other.push_back(5);674675CHECK(vector == vector_other);676677vector_other.push_back(10);678CHECK(vector != vector_other);679}680681struct CyclicVectorHolder {682Vector<CyclicVectorHolder> *vector = nullptr;683bool is_destructing = false;684685~CyclicVectorHolder() {686if (is_destructing) {687// The vector must exist and not expose its backing array at this point.688CHECK_NE(vector, nullptr);689CHECK_EQ(vector->ptr(), nullptr);690}691}692};693694TEST_CASE("[Vector] Cyclic Reference") {695// Create a stack-space vector.696Vector<CyclicVectorHolder> vector;697// Add a new (empty) element.698vector.resize(1);699// Expose the vector to its element through CyclicVectorHolder.700// This is questionable behavior, but should still behave graciously.701vector.ptrw()[0] = CyclicVectorHolder{ &vector };702vector.ptrw()[0].is_destructing = true;703// The vector goes out of scope and destructs, calling CyclicVectorHolder's destructor.704}705706} // namespace TestVector707708709