2024-02-25 01:28:04 +02:00
|
|
|
#include "nix_api_store.h"
|
|
|
|
#include "nix_api_store_internal.h"
|
|
|
|
#include "nix_api_util.h"
|
|
|
|
#include "nix_api_util_internal.h"
|
|
|
|
#include "nix_api_expr.h"
|
|
|
|
#include "nix_api_expr_internal.h"
|
|
|
|
#include "nix_api_value.h"
|
|
|
|
#include "nix_api_external.h"
|
2024-04-15 22:05:52 +03:00
|
|
|
|
2024-02-25 19:14:32 +02:00
|
|
|
#include "tests/nix_api_expr.hh"
|
2024-04-15 22:05:52 +03:00
|
|
|
#include "tests/string_callback.hh"
|
2024-02-25 01:28:04 +02:00
|
|
|
|
|
|
|
#include <gtest/gtest.h>
|
|
|
|
|
|
|
|
namespace nixC {
|
|
|
|
|
|
|
|
class MyExternalValueDesc : public NixCExternalValueDesc
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
MyExternalValueDesc(int x)
|
|
|
|
: _x(x)
|
|
|
|
{
|
|
|
|
print = print_function;
|
|
|
|
showType = show_type_function;
|
|
|
|
typeOf = type_of_function;
|
|
|
|
}
|
|
|
|
|
|
|
|
private:
|
|
|
|
int _x;
|
|
|
|
static void print_function(void * self, nix_printer * printer) {}
|
|
|
|
|
|
|
|
static void show_type_function(void * self, nix_string_return * res) {}
|
|
|
|
|
|
|
|
static void type_of_function(void * self, nix_string_return * res)
|
|
|
|
{
|
|
|
|
MyExternalValueDesc * obj = static_cast<MyExternalValueDesc *>(self);
|
|
|
|
|
|
|
|
std::string type_string = "nix-external<MyExternalValueDesc( ";
|
|
|
|
type_string += std::to_string(obj->_x);
|
|
|
|
type_string += " )>";
|
|
|
|
res->str = &*type_string.begin();
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2024-02-25 19:14:32 +02:00
|
|
|
TEST_F(nix_api_expr_test, nix_expr_eval_external)
|
2024-02-25 01:28:04 +02:00
|
|
|
{
|
|
|
|
MyExternalValueDesc * external = new MyExternalValueDesc(42);
|
|
|
|
ExternalValue * val = nix_create_external_value(ctx, external, external);
|
2024-03-29 15:00:19 +02:00
|
|
|
nix_init_external(ctx, value, val);
|
2024-02-25 01:28:04 +02:00
|
|
|
|
|
|
|
EvalState * stateResult = nix_state_create(nullptr, nullptr, store);
|
|
|
|
Value * valueResult = nix_alloc_value(nullptr, stateResult);
|
|
|
|
|
|
|
|
EvalState * stateFn = nix_state_create(nullptr, nullptr, store);
|
|
|
|
Value * valueFn = nix_alloc_value(nullptr, stateFn);
|
|
|
|
|
|
|
|
nix_expr_eval_from_string(nullptr, state, "builtins.typeOf", ".", valueFn);
|
|
|
|
|
|
|
|
ASSERT_EQ(NIX_TYPE_EXTERNAL, nix_get_type(nullptr, value));
|
|
|
|
|
|
|
|
nix_value_call(ctx, state, valueFn, value, valueResult);
|
|
|
|
|
2024-04-15 22:05:52 +03:00
|
|
|
std::string string_value;
|
|
|
|
nix_get_string(nullptr, valueResult, OBSERVE_STRING(string_value));
|
|
|
|
ASSERT_STREQ("nix-external<MyExternalValueDesc( 42 )>", string_value.c_str());
|
2024-02-25 01:28:04 +02:00
|
|
|
}
|
2024-04-15 22:05:52 +03:00
|
|
|
|
2024-02-25 01:28:04 +02:00
|
|
|
}
|