Packages

A bridge between Glamorous Toolkit (GT) and the BEAM VM, enabling remote code evaluation, object inspection, and Phlow view rendering.

Current section

Files

Jump to
gt_bridge lib examples e_analysis.ex
Raw

lib/examples/e_analysis.ex

defmodule Examples.EAnalysis do
@moduledoc """
I am examples for GtBridge.Analysis, the static analysis module.
"""
use ExExample
import ExUnit.Assertions
alias GtBridge.Analysis
def rerun?(_), do: true
############################################################
# Module Graph Examples #
############################################################
@spec module_graph() :: [Analysis.edge()]
example module_graph do
edges = Analysis.module_graph(:gt_bridge)
assert length(edges) > 0
assert Enum.all?(edges, fn {from, to} -> is_atom(from) and is_atom(to) end)
# Eval calls ObjectRegistry
assert {GtBridge.Eval, GtBridge.ObjectRegistry} in edges
edges
end
@spec callees_of_eval() :: [module()]
example callees_of_eval do
mods = Analysis.callees(GtBridge.Eval, :gt_bridge)
assert GtBridge.ObjectRegistry in mods
assert GtBridge.Eval not in mods
mods
end
@spec callers_of_serializer() :: [module()]
example callers_of_serializer do
mods = Analysis.callers(GtBridge.Serializer, :gt_bridge)
assert length(mods) > 0
mods
end
############################################################
# Doc Coverage Examples #
############################################################
@spec doc_coverage() :: [{module(), Analysis.doc_status()}]
example doc_coverage do
coverage = Analysis.doc_coverage(:gt_bridge)
assert length(coverage) > 0
assert Enum.all?(coverage, fn {_, s} -> s in [:full, :partial, :none] end)
# GtBridge.Eval has a moduledoc
assert {GtBridge.Eval, :full} in coverage
coverage
end
############################################################
# Supervision Tree Examples #
############################################################
@spec supervision_tree() :: map()
example supervision_tree do
pid = Process.whereis(GtBridge.Supervisor)
tree = Analysis.supervision_tree(pid)
assert tree.name == "GtBridge.Supervisor"
assert tree.supervisor == true
assert length(tree.children) > 0
tree
end
############################################################
# System-Wide Examples #
############################################################
@spec system_stats() :: map()
example system_stats do
stats = Analysis.system_stats()
assert stats.apps > 0
assert stats.modules > 0
assert stats.with_docs >= 0
stats
end
@spec system_doc_coverage() :: [map()]
example system_doc_coverage do
coverage = Analysis.system_doc_coverage()
assert length(coverage) > 0
assert Enum.all?(coverage, fn c -> is_binary(c.app) end)
gt = Enum.find(coverage, fn c -> c.app == "gt_bridge" end)
assert gt != nil
assert length(gt.modules) > 0
coverage
end
############################################################
# New Function Examples #
############################################################
@spec system_info() :: map()
example system_info do
info = Analysis.system_info()
assert is_binary(info.node)
assert is_binary(info.elixir)
assert info.schedulers > 0
assert info.memory_mb > 0
info
end
@spec module_details() :: [map()]
example module_details do
details = Analysis.module_details(:gt_bridge)
assert length(details) > 0
eval = Enum.find(details, fn d -> d.name == "GtBridge.Eval" end)
assert eval != nil
assert eval.has_doc == true
assert eval.functions > 0
details
end
@spec root_apps() :: [atom()]
example root_apps do
roots = Analysis.root_apps()
assert length(roots) > 0
assert is_atom(hd(roots))
roots
end
@spec exported_functions() :: [map()]
example exported_functions do
fns = Analysis.exported_functions(GtBridge.Eval)
assert length(fns) > 0
assert Enum.any?(fns, fn f -> f.name == "eval" end)
fns
end
@spec exported_functions_erlang() :: [map()]
example exported_functions_erlang do
fns = Analysis.exported_functions(:erlang)
assert length(fns) > 0
assert Enum.any?(fns, fn f -> f.name == "node" end)
fns
end
@spec example_deps() :: [{String.t(), [String.t()]}]
example example_deps do
deps = Analysis.example_deps(Examples.EEval)
assert length(deps) > 0
{name, _} = hd(deps)
assert is_binary(name)
deps
end
@spec app_dep_tree() :: map()
example app_dep_tree do
tree = Analysis.app_dep_tree(:gt_bridge)
assert tree.name == "gt_bridge"
assert length(tree.children) > 0
tree
end
@spec app_reverse_dep_tree() :: map()
example app_reverse_dep_tree do
tree = Analysis.app_reverse_dep_tree(:gt_bridge)
assert tree.name == "gt_bridge"
tree
end
@spec mnesia_tables() :: [map()]
example mnesia_tables do
tables =
try do
Analysis.mnesia_tables()
rescue
_ -> []
end
assert is_list(tables)
tables
end
end