- 他配列を受け取り好きな処理をする関数を作る
配列に対して処理を加える関数をいくつか作成しました。 コードはレポート巻末に記載しました。 いくつかの関数に対して,単体テストを実施しました。 テストしたコード及び結果は以下のようになりました。
#include <gtest/gtest.h>
#include <gmock/gmock.h>
#include "helper.hpp"
TEST(FindTest, BasicAssertions) {
int _[] = {1, 2, 3, 4, 5};
EXPECT_EQ(3, find(_, 0, 5, [](int v, int i, int s[]){ return v == 3 ;}));
}
TEST(EveryTest, BasicAssertions) {
int _[] = {1, 2, 3, 4, 5};
EXPECT_EQ(true, every(_, 0, 5, [](int v, int i, int s[]){ return v > 0; }));
EXPECT_EQ(false, every(_, 0, 5, [](int v, int i, int s[]){ return v > 3; }));
}
TEST(SomeTest, BasicAssertions) {
int _[] = {1, 2, 3, 4, 5};
EXPECT_EQ(true, some(_, 0, 5, [](int v, int i, int s[]){ return v > 3; }));
EXPECT_EQ(false, some(_, 0, 5, [](int v, int i, int s[]){ return v > 5; }));
}
yarn run v1.22.10
$ yarn cmake && yarn ctest
$ cd modules/core/src && cmake -S . -B build && cmake --build build
-- Selecting Windows SDK version 10.0.18362.0 to target Windows 10.0.19042.
-- Configuring done
-- Generating done
-- Build files have been written to: ~/src/build
Microsoft (R) Build Engine version 16.7.0+b89cb5fde for .NET Framework
Copyright (C) Microsoft Corporation. All rights reserved.
gmock.vcxproj -> ~\src\build\lib\Debug\gmockd.lib
gmock_main.vcxproj -> ~\src\build\lib\Debug\gmock_maind.lib
gtest.vcxproj -> ~\src\build\lib\Debug\gtestd.lib
gtest_main.vcxproj -> ~\src\build\lib\Debug\gtest_maind.lib
helper_test.cc
helper_test.vcxproj -> ~\src\build\Debug\helper_test.exe
$ cd modules/core/src/build && ctest
Test project ~/src/build
Start 1: FindTest.BasicAssertions
1/3 Test #1: FindTest.BasicAssertions ......... Passed 0.01 sec
Start 2: EveryTest.BasicAssertions
2/3 Test #2: EveryTest.BasicAssertions ........ Passed 0.02 sec
Start 3: SomeTest.BasicAssertions
3/3 Test #3: SomeTest.BasicAssertions ......... Passed 0.01 sec
100% tests passed, 0 tests failed out of 3
Total Test time (real) = 0.08 sec
Done in 5.32s.
まず、gccに加え、cmake、makeおよびgtestの環境を構築しました。 単体テストはGoogleTestおよびGoogleMockを使用しました。 GoogleTestはc++のテストフレームワークで、 cmakeはコンパイラに依存しないビルド自動化のソフトです。 quickstart-cmake.md およびsamples.mdを参考にしました。 関数の定義に関しては, Array - JavaScript | MDNを参考にしました。 Mockを用いたテストまで出来なかったので、今後試してみたいと思います。
#ifndef _HERLPER_HPP
#define _HERLPER_HPP
using $void = void (*)(int v, int i, int s[]);
using $bool = bool (*)(int v, int i, int s[]);
using $int = int (*)(int v, int i, int s[]);
void each (int _[], int a, int b, $void $) {
for (; a < b ;) $(_[a], a++, _);
}
void map (int _[], int a, int b, $int $) {
for (; a < b ;) _[a] = $(_[a], a++, _);
};
void fill (int _[], int a, int b, int value) {
for (; a < b ;) _[a] = value;
}
void filter (int _[], int a, int b, $int $) {
for (; a < b ;) _[a] = $(_[a], a++, _) && _[a - 1];
}
void slice(int _[], int a, int b) {
int i = 0;
for (; a < b ;) if (i < a || b < i++) _[i] = -1;
}
int find (int _[], int a, int b, $bool $) {
for (; a < b ; a++) if ($(_[a], a, _)) return _[a];
return -1;
}
bool every (int _[], int a, int b, $bool $) {
for (; a < b ; a++) if (!$(_[a], a, _)) return false; return true;
}
bool some (int _[], int a, int b, $bool $) {
for (; a < b ; a++) if ($(_[a], a, _)) return true; return false;
}
#endif // _HERLPER_HPP