2021-03-04 10:36:24 +01:00
|
|
|
// SPDX-FileCopyrightText: 2020 HoundThe <cgkajm@gmail.com>
|
|
|
|
|
// SPDX-License-Identifier: LGPL-3.0-only
|
|
|
|
|
|
2020-10-01 16:13:03 +02:00
|
|
|
#include <rz_core.h>
|
2020-12-06 12:25:27 -06:00
|
|
|
#include <rz_analysis.h>
|
2020-10-01 16:13:03 +02:00
|
|
|
#include <rz_util.h>
|
2020-10-08 17:50:14 +08:00
|
|
|
#include <rz_util/rz_graph_drawable.h>
|
2020-08-07 11:23:52 +02:00
|
|
|
#include "minunit.h"
|
|
|
|
|
|
|
|
|
|
bool test_inherit_graph_creation() {
|
2020-10-01 16:13:03 +02:00
|
|
|
RzCore *core = rz_core_new();
|
|
|
|
|
rz_core_cmd0(core, "ac A");
|
|
|
|
|
rz_core_cmd0(core, "ac B");
|
|
|
|
|
rz_core_cmd0(core, "ac C");
|
|
|
|
|
rz_core_cmd0(core, "ac D");
|
|
|
|
|
rz_core_cmd0(core, "acb B A");
|
|
|
|
|
rz_core_cmd0(core, "acb C A");
|
|
|
|
|
rz_core_cmd0(core, "acb D B");
|
|
|
|
|
rz_core_cmd0(core, "acb D C");
|
2020-12-06 12:25:27 -06:00
|
|
|
RzGraph *graph = rz_analysis_class_get_inheritance_graph(core->analysis);
|
2020-08-07 11:23:52 +02:00
|
|
|
mu_assert_notnull(graph, "Couldn't create the graph");
|
2026-04-07 20:01:40 +00:00
|
|
|
mu_assert_eq(rz_graph_count_nodes(graph), 4, "Wrong node count");
|
2020-08-07 11:23:52 +02:00
|
|
|
|
2026-04-07 20:01:40 +00:00
|
|
|
RzIterator *iter = rz_graph_get_nodes(graph);
|
|
|
|
|
mu_assert_notnull(iter, "get_nodes iterator");
|
2020-10-08 17:50:14 +08:00
|
|
|
RzGraphNode *node;
|
2020-08-07 11:23:52 +02:00
|
|
|
int i = 0;
|
2026-04-07 20:01:40 +00:00
|
|
|
rz_iterator_foreach(iter, node) {
|
|
|
|
|
const RzGraphNodeInfo *info = rz_graph_node_get_data(node);
|
2020-08-07 11:23:52 +02:00
|
|
|
switch (i++) {
|
|
|
|
|
case 0:
|
2024-02-09 14:23:36 +00:00
|
|
|
mu_assert_streq(info->def.title, "A", "Wrong node name");
|
2026-04-07 20:01:40 +00:00
|
|
|
mu_assert_eq(rz_graph_out_degree(graph, node), 2, "Wrong node out-nodes");
|
2020-08-07 11:23:52 +02:00
|
|
|
{
|
2026-04-07 20:01:40 +00:00
|
|
|
RzIterator *out_iter = rz_graph_out_neighbors(graph, node);
|
|
|
|
|
mu_assert_notnull(out_iter, "out_neighbors iter A");
|
2020-10-08 17:50:14 +08:00
|
|
|
RzGraphNode *out_node;
|
2026-04-07 20:01:40 +00:00
|
|
|
int j = 0;
|
|
|
|
|
rz_iterator_foreach(out_iter, out_node) {
|
|
|
|
|
const RzGraphNodeInfo *out_info = rz_graph_node_get_data(out_node);
|
|
|
|
|
switch (j++) {
|
2020-08-07 11:23:52 +02:00
|
|
|
case 0:
|
2026-04-07 20:01:40 +00:00
|
|
|
mu_assert_streq(out_info->def.title, "B", "Wrong node name");
|
2020-08-07 11:23:52 +02:00
|
|
|
break;
|
|
|
|
|
case 1:
|
2026-04-07 20:01:40 +00:00
|
|
|
mu_assert_streq(out_info->def.title, "C", "Wrong node name");
|
2020-08-07 11:23:52 +02:00
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
2026-04-07 20:01:40 +00:00
|
|
|
rz_iterator_free(out_iter);
|
2020-08-07 11:23:52 +02:00
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case 1:
|
2024-02-09 14:23:36 +00:00
|
|
|
mu_assert_streq(info->def.title, "B", "Wrong node name");
|
2026-04-07 20:01:40 +00:00
|
|
|
mu_assert_eq(rz_graph_out_degree(graph, node), 1, "Wrong node out-nodes");
|
|
|
|
|
mu_assert_eq(rz_graph_in_degree(graph, node), 1, "Wrong node in-nodes");
|
2020-08-07 11:23:52 +02:00
|
|
|
{
|
2026-04-07 20:01:40 +00:00
|
|
|
RzIterator *out_iter = rz_graph_out_neighbors(graph, node);
|
|
|
|
|
mu_assert_notnull(out_iter, "out_neighbors iter B");
|
2020-10-08 17:50:14 +08:00
|
|
|
RzGraphNode *out_node;
|
2026-04-07 20:01:40 +00:00
|
|
|
int j = 0;
|
|
|
|
|
rz_iterator_foreach(out_iter, out_node) {
|
|
|
|
|
const RzGraphNodeInfo *out_info = rz_graph_node_get_data(out_node);
|
|
|
|
|
switch (j++) {
|
2020-08-07 11:23:52 +02:00
|
|
|
case 0:
|
2026-04-07 20:01:40 +00:00
|
|
|
mu_assert_streq(out_info->def.title, "D", "Wrong node name");
|
2020-08-07 11:23:52 +02:00
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
2026-04-07 20:01:40 +00:00
|
|
|
rz_iterator_free(out_iter);
|
2020-08-07 11:23:52 +02:00
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case 2:
|
2024-02-09 14:23:36 +00:00
|
|
|
mu_assert_streq(info->def.title, "C", "Wrong node name");
|
2026-04-07 20:01:40 +00:00
|
|
|
mu_assert_eq(rz_graph_out_degree(graph, node), 1, "Wrong node out-nodes");
|
|
|
|
|
mu_assert_eq(rz_graph_in_degree(graph, node), 1, "Wrong node in-nodes");
|
2020-08-07 11:23:52 +02:00
|
|
|
{
|
2026-04-07 20:01:40 +00:00
|
|
|
RzIterator *out_iter = rz_graph_out_neighbors(graph, node);
|
|
|
|
|
mu_assert_notnull(out_iter, "out_neighbors iter C");
|
2020-10-08 17:50:14 +08:00
|
|
|
RzGraphNode *out_node;
|
2026-04-07 20:01:40 +00:00
|
|
|
int j = 0;
|
|
|
|
|
rz_iterator_foreach(out_iter, out_node) {
|
|
|
|
|
const RzGraphNodeInfo *out_info = rz_graph_node_get_data(out_node);
|
|
|
|
|
switch (j++) {
|
2020-08-07 11:23:52 +02:00
|
|
|
case 0:
|
2026-04-07 20:01:40 +00:00
|
|
|
mu_assert_streq(out_info->def.title, "D", "Wrong node name");
|
2020-08-07 11:23:52 +02:00
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
2026-04-07 20:01:40 +00:00
|
|
|
rz_iterator_free(out_iter);
|
2020-08-07 11:23:52 +02:00
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case 3:
|
2024-02-09 14:23:36 +00:00
|
|
|
mu_assert_streq(info->def.title, "D", "Wrong node name");
|
2026-04-07 20:01:40 +00:00
|
|
|
mu_assert_eq(rz_graph_in_degree(graph, node), 2, "Wrong node in-nodes");
|
2020-08-07 11:23:52 +02:00
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
2026-04-07 20:01:40 +00:00
|
|
|
rz_iterator_free(iter);
|
2020-10-01 16:13:03 +02:00
|
|
|
rz_core_free(core);
|
|
|
|
|
rz_graph_free(graph);
|
2020-08-07 11:23:52 +02:00
|
|
|
mu_end;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int all_tests() {
|
|
|
|
|
mu_run_test(test_inherit_graph_creation);
|
|
|
|
|
return tests_passed != tests_run;
|
|
|
|
|
}
|
|
|
|
|
|
2024-02-09 14:23:36 +00:00
|
|
|
mu_main(all_tests)
|