use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq)]
pub struct PropertyValue {
#[serde(flatten)]
pub value: Option<PropertyValueEnum>,
}
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq)]
#[serde(tag = "type", content = "value")]
pub enum PropertyValueEnum {
#[serde(rename = "string_value")]
StringValue(String),
#[serde(rename = "bool_value")]
BoolValue(bool),
#[serde(rename = "int_value")]
IntValue(i32),
#[serde(rename = "long_value")]
LongValue(i64),
#[serde(rename = "float_value")]
FloatValue(f32),
#[serde(rename = "double_value")]
DoubleValue(f64),
#[serde(rename = "string_list")]
StringList(StringList),
#[serde(rename = "bool_list")]
BoolList(BoolList),
#[serde(rename = "int_list")]
IntList(IntList),
#[serde(rename = "long_list")]
LongList(LongList),
#[serde(rename = "float_list")]
FloatList(FloatList),
#[serde(rename = "double_list")]
DoubleList(DoubleList),
#[serde(rename = "contained_refs")]
ContainedRefs(ContainedRefs),
}
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq)]
pub struct ContainedRefs {
pub local_name: String,
pub refs: Vec<i64>,
}
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq)]
pub struct StringList {
pub values: Vec<String>,
}
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq)]
pub struct BoolList {
pub values: Vec<bool>,
}
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq)]
pub struct IntList {
pub values: Vec<i32>,
}
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq)]
pub struct LongList {
pub values: Vec<i64>,
}
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq)]
pub struct FloatList {
pub values: Vec<f32>,
}
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq)]
pub struct DoubleList {
pub values: Vec<f64>,
}
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq)]
pub struct Cpg {
pub node: Vec<Node>,
pub edge: Vec<Edge>,
}
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq)]
pub struct Node {
pub key: i64,
pub r#type: NodeType,
pub property: Vec<NodeProperty>,
}
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq)]
pub struct NodeProperty {
pub name: NodePropertyName,
pub value: Option<PropertyValue>,
}
#[derive(Serialize, Deserialize, Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub enum NodeType {
#[serde(rename = "UNKNOWN_NODE_TYPE")]
UnknownNodeType = 0,
#[serde(rename = "METHOD")]
Method = 1,
#[serde(rename = "METHOD_RETURN")]
MethodReturn = 3,
#[serde(rename = "ANNOTATION")]
Annotation = 5,
#[serde(rename = "ANNOTATION_PARAMETER_ASSIGN")]
AnnotationParameterAssign = 6,
#[serde(rename = "ANNOTATION_PARAMETER")]
AnnotationParameter = 7,
#[serde(rename = "LITERAL")]
Literal = 8,
#[serde(rename = "MEMBER")]
Member = 9,
#[serde(rename = "ARRAY_INITIALIZER")]
ArrayInitializer = 14,
#[serde(rename = "CALL")]
Call = 15,
#[serde(rename = "LOCAL")]
Local = 23,
#[serde(rename = "TAG")]
Tag = 24,
#[serde(rename = "LOCATION")]
Location = 25,
#[serde(rename = "IDENTIFIER")]
Identifier = 27,
#[serde(rename = "RETURN")]
Return = 30,
#[serde(rename = "BLOCK")]
Block = 31,
#[serde(rename = "METHOD_PARAMETER_OUT")]
MethodParameterOut = 33,
#[serde(rename = "METHOD_PARAMETER_IN")]
MethodParameterIn = 34,
#[serde(rename = "DEPENDENCY")]
Dependency = 35,
#[serde(rename = "FILE")]
File = 38,
#[serde(rename = "META_DATA")]
MetaData = 39,
#[serde(rename = "NAMESPACE")]
Namespace = 40,
#[serde(rename = "NAMESPACE_BLOCK")]
NamespaceBlock = 41,
#[serde(rename = "UNKNOWN")]
Unknown = 44,
#[serde(rename = "TYPE")]
Type = 45,
#[serde(rename = "TYPE_DECL")]
TypeDecl = 46,
#[serde(rename = "TYPE_PARAMETER")]
TypeParameter = 47,
#[serde(rename = "TYPE_ARGUMENT")]
TypeArgument = 48,
#[serde(rename = "ANNOTATION_LITERAL")]
AnnotationLiteral = 49,
#[serde(rename = "CONFIG_FILE")]
ConfigFile = 50,
#[serde(rename = "BINDING")]
Binding = 146,
#[serde(rename = "TAG_NODE_PAIR")]
TagNodePair = 208,
#[serde(rename = "FINDING")]
Finding = 214,
#[serde(rename = "KEY_VALUE_PAIR")]
KeyValuePair = 217,
#[serde(rename = "MODIFIER")]
Modifier = 300,
#[serde(rename = "METHOD_REF")]
MethodRef = 333,
#[serde(rename = "CLOSURE_BINDING")]
ClosureBinding = 334,
#[serde(rename = "TYPE_REF")]
TypeRef = 335,
#[serde(rename = "CONTROL_STRUCTURE")]
ControlStructure = 339,
#[serde(rename = "JUMP_TARGET")]
JumpTarget = 340,
#[serde(rename = "JUMP_LABEL")]
JumpLabel = 341,
#[serde(rename = "TEMPLATE_DOM")]
TemplateDom = 417,
#[serde(rename = "COMMENT")]
Comment = 511,
#[serde(rename = "FIELD_IDENTIFIER")]
FieldIdentifier = 2001081,
}
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq)]
pub struct Edge {
pub src: i64,
pub dst: i64,
pub r#type: EdgeType,
pub property: Vec<EdgeProperty>,
}
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq)]
pub struct EdgeProperty {
pub name: EdgePropertyName,
pub value: Option<PropertyValue>,
}
#[derive(Serialize, Deserialize, Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub enum EdgeType {
#[serde(rename = "UNKNOWN_EDGE_TYPE")]
UnknownEdgeType = 0,
#[serde(rename = "AST")]
Ast = 3,
#[serde(rename = "CALL")]
Call = 6,
#[serde(rename = "REF")]
Ref = 10,
#[serde(rename = "TAGGED_BY")]
TaggedBy = 11,
#[serde(rename = "PARAMETER_LINK")]
ParameterLink = 12,
#[serde(rename = "CFG")]
Cfg = 19,
#[serde(rename = "EVAL_TYPE")]
EvalType = 21,
#[serde(rename = "BINDS_TO")]
BindsTo = 22,
#[serde(rename = "INHERITS_FROM")]
InheritsFrom = 23,
#[serde(rename = "CONTAINS")]
Contains = 28,
#[serde(rename = "CAPTURE")]
Capture = 40,
#[serde(rename = "CAPTURED_BY")]
CapturedBy = 41,
#[serde(rename = "RECEIVER")]
Receiver = 55,
#[serde(rename = "CONDITION")]
Condition = 56,
#[serde(rename = "REACHING_DEF")]
ReachingDef = 137,
#[serde(rename = "ALIAS_OF")]
AliasOf = 138,
#[serde(rename = "BINDS")]
Binds = 155,
#[serde(rename = "ARGUMENT")]
Argument = 156,
#[serde(rename = "SOURCE_FILE")]
SourceFile = 157,
#[serde(rename = "DOMINATE")]
Dominate = 181,
#[serde(rename = "POST_DOMINATE")]
PostDominate = 182,
#[serde(rename = "CDG")]
Cdg = 183,
#[serde(rename = "IMPORTS")]
Imports = 23663,
#[serde(rename = "IS_CALL_FOR_IMPORT")]
IsCallForImport = 23664,
}
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq)]
pub struct AdditionalNodeProperty {
pub node_id: i64,
pub property: Option<NodeProperty>,
}
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq)]
pub struct AdditionalEdgeProperty {
pub edge_id: i64,
pub property: Option<EdgeProperty>,
pub out_node_key: i64,
pub in_node_key: i64,
pub edge_type: EdgeType,
}
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq)]
pub struct CpgOverlay {
pub node: Vec<Node>,
pub edge: Vec<Edge>,
pub node_property: Vec<AdditionalNodeProperty>,
pub edge_property: Vec<AdditionalEdgeProperty>,
}
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq)]
pub struct DiffGraph {
pub entries: Vec<DiffGraphEntry>,
}
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq)]
#[serde(tag = "type", content = "content")]
pub enum DiffGraphEntry {
#[serde(rename = "node")]
Node(Node),
#[serde(rename = "edge")]
Edge(Edge),
#[serde(rename = "node_property")]
NodeProperty(AdditionalNodeProperty),
#[serde(rename = "edge_property")]
EdgeProperty(AdditionalEdgeProperty),
#[serde(rename = "remove_node")]
RemoveNode(RemoveNode),
#[serde(rename = "remove_node_property")]
RemoveNodeProperty(RemoveNodeProperty),
#[serde(rename = "remove_edge")]
RemoveEdge(RemoveEdge),
#[serde(rename = "remove_edge_property")]
RemoveEdgeProperty(RemoveEdgeProperty),
}
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq)]
pub struct RemoveNode {
pub key: i64,
}
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq)]
pub struct RemoveNodeProperty {
pub key: i64,
pub name: NodePropertyName,
pub local_name: String,
}
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq)]
pub struct RemoveEdge {
pub out_node_key: i64,
pub in_node_key: i64,
pub edge_type: EdgeType,
pub properties_hash: Vec<u8>,
}
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq)]
pub struct RemoveEdgeProperty {
pub out_node_key: i64,
pub in_node_key: i64,
pub edge_type: EdgeType,
pub properties_hash: Vec<u8>,
pub property_name: EdgePropertyName,
}
#[derive(Serialize, Deserialize, Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub enum NodePropertyName {
#[serde(rename = "UNKNOWN_NODE_PROPERTY")]
UnknownNodeProperty = 0,
#[serde(rename = "LINE_NUMBER")]
LineNumber = 2,
#[serde(rename = "PARSER_TYPE_NAME")]
ParserTypeName = 3,
#[serde(rename = "ORDER")]
Order = 4,
#[serde(rename = "NAME")]
Name = 5,
#[serde(rename = "FULL_NAME")]
FullName = 6,
#[serde(rename = "IS_EXTERNAL")]
IsExternal = 7,
#[serde(rename = "VALUE")]
Value = 8,
#[serde(rename = "COLUMN_NUMBER")]
ColumnNumber = 11,
#[serde(rename = "LINE_NUMBER_END")]
LineNumberEnd = 12,
#[serde(rename = "VERSION")]
Version = 13,
#[serde(rename = "EVALUATION_STRATEGY")]
EvaluationStrategy = 15,
#[serde(rename = "COLUMN_NUMBER_END")]
ColumnNumberEnd = 16,
#[serde(rename = "LANGUAGE")]
Language = 19,
#[serde(rename = "CONTENT")]
Content = 20,
#[serde(rename = "CODE")]
Code = 21,
#[serde(rename = "SIGNATURE")]
Signature = 22,
#[serde(rename = "DISPATCH_TYPE")]
DispatchType = 25,
#[serde(rename = "MODIFIER_TYPE")]
ModifierType = 26,
#[serde(rename = "CONTROL_STRUCTURE_TYPE")]
ControlStructureType = 27,
#[serde(rename = "ARGUMENT_INDEX")]
ArgumentIndex = 40,
#[serde(rename = "CLOSURE_BINDING_ID")]
ClosureBindingId = 50,
#[serde(rename = "TYPE_FULL_NAME")]
TypeFullName = 51,
#[serde(rename = "TYPE_DECL_FULL_NAME")]
TypeDeclFullName = 52,
#[serde(rename = "INHERITS_FROM_TYPE_FULL_NAME")]
InheritsFromTypeFullName = 53,
#[serde(rename = "METHOD_FULL_NAME")]
MethodFullName = 54,
#[serde(rename = "AST_PARENT_TYPE")]
AstParentType = 56,
#[serde(rename = "AST_PARENT_FULL_NAME")]
AstParentFullName = 57,
#[serde(rename = "DEPENDENCY_GROUP_ID")]
DependencyGroupId = 58,
#[serde(rename = "SYMBOL")]
Symbol = 100,
#[serde(rename = "METHOD_SHORT_NAME")]
MethodShortName = 102,
#[serde(rename = "PACKAGE_NAME")]
PackageName = 103,
#[serde(rename = "CLASS_NAME")]
ClassName = 104,
#[serde(rename = "NODE_LABEL")]
NodeLabel = 105,
#[serde(rename = "FILENAME")]
Filename = 106,
#[serde(rename = "OVERLAYS")]
Overlays = 118,
#[serde(rename = "HASH")]
Hash = 120,
#[serde(rename = "ARGUMENT_NAME")]
ArgumentName = 130,
#[serde(rename = "KEY")]
Key = 131,
#[serde(rename = "CLASS_SHORT_NAME")]
ClassShortName = 132,
#[serde(rename = "ALIAS_TYPE_FULL_NAME")]
AliasTypeFullName = 158,
#[serde(rename = "CLOSURE_ORIGINAL_NAME")]
ClosureOriginalName = 159,
#[serde(rename = "IS_VARIADIC")]
IsVariadic = 221,
#[serde(rename = "ROOT")]
Root = 1199,
#[serde(rename = "DYNAMIC_TYPE_HINT_FULL_NAME")]
DynamicTypeHintFullName = 1591,
#[serde(rename = "POSSIBLE_TYPES")]
PossibleTypes = 1592,
#[serde(rename = "INDEX")]
Index = 2223,
#[serde(rename = "GENERIC_SIGNATURE")]
GenericSignature = 3000,
#[serde(rename = "OFFSET")]
Offset = 3812,
#[serde(rename = "OFFSET_END")]
OffsetEnd = 3813,
#[serde(rename = "CANONICAL_NAME")]
CanonicalName = 2001092,
#[serde(rename = "CONTAINED_REF")]
ContainedRef = 2007161,
}
#[derive(Serialize, Deserialize, Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub enum EdgePropertyName {
#[serde(rename = "UNKNOWN_EDGE_PROPERTY")]
UnknownEdgeProperty = 0,
#[serde(rename = "VARIABLE")]
Variable = 11,
}
#[derive(Serialize, Deserialize, Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub enum ModifierTypes {
#[serde(rename = "UNKNOWN_MODIFIER_TYPE")]
UnknownModifierType = 0,
#[serde(rename = "STATIC")]
Static = 1,
#[serde(rename = "PUBLIC")]
Public = 2,
#[serde(rename = "PROTECTED")]
Protected = 3,
#[serde(rename = "PRIVATE")]
Private = 4,
#[serde(rename = "ABSTRACT")]
Abstract = 5,
#[serde(rename = "NATIVE")]
Native = 6,
#[serde(rename = "CONSTRUCTOR")]
Constructor = 7,
#[serde(rename = "VIRTUAL")]
Virtual = 8,
#[serde(rename = "INTERNAL")]
Internal = 9,
#[serde(rename = "FINAL")]
Final = 10,
#[serde(rename = "READONLY")]
Readonly = 11,
#[serde(rename = "MODULE")]
Module = 12,
#[serde(rename = "LAMBDA")]
Lambda = 13,
}
#[derive(Serialize, Deserialize, Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub enum Languages {
#[serde(rename = "UNKNOWN_LANGUAGE")]
UnknownLanguage = 0,
#[serde(rename = "JAVA")]
Java = 1,
#[serde(rename = "JAVASCRIPT")]
Javascript = 2,
#[serde(rename = "GOLANG")]
Golang = 3,
#[serde(rename = "CSHARP")]
Csharp = 4,
#[serde(rename = "C")]
C = 5,
#[serde(rename = "PYTHON")]
Python = 6,
#[serde(rename = "LLVM")]
Llvm = 7,
#[serde(rename = "PHP")]
Php = 8,
#[serde(rename = "FUZZY_TEST_LANG")]
FuzzyTestLang = 9,
#[serde(rename = "GHIDRA")]
Ghidra = 10,
#[serde(rename = "KOTLIN")]
Kotlin = 11,
#[serde(rename = "NEWC")]
Newc = 12,
#[serde(rename = "JAVASRC")]
Javasrc = 13,
#[serde(rename = "PYTHONSRC")]
Pythonsrc = 14,
#[serde(rename = "JSSRC")]
Jssrc = 15,
#[serde(rename = "RUBYSRC")]
Rubysrc = 17,
#[serde(rename = "SWIFTSRC")]
Swiftsrc = 18,
#[serde(rename = "CSHARPSRC")]
Csharpsrc = 19,
}
#[derive(Serialize, Deserialize, Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub enum EvaluationStrategies {
#[serde(rename = "UNKNOWN_EVALUATION_STRATEGY")]
UnknownEvaluationStrategy = 0,
#[serde(rename = "BY_REFERENCE")]
ByReference = 1,
#[serde(rename = "BY_SHARING")]
BySharing = 2,
#[serde(rename = "BY_VALUE")]
ByValue = 3,
}
#[derive(Serialize, Deserialize, Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub enum DispatchTypes {
#[serde(rename = "UNKNOWN_DISPATCH_TYPE")]
UnknownDispatchType = 0,
#[serde(rename = "STATIC_DISPATCH")]
StaticDispatch = 1,
#[serde(rename = "DYNAMIC_DISPATCH")]
DynamicDispatch = 2,
#[serde(rename = "INLINED")]
Inlined = 3,
}
#[derive(Serialize, Deserialize, Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub enum ControlStructureTypes {
#[serde(rename = "UNKNOWN_CONTROL_STRUCTURE_TYPE")]
UnknownControlStructureType = 0,
#[serde(rename = "BREAK")]
Break = 1,
#[serde(rename = "CONTINUE")]
Continue = 2,
#[serde(rename = "WHILE")]
While = 3,
#[serde(rename = "DO")]
Do = 4,
#[serde(rename = "FOR")]
For = 5,
#[serde(rename = "GOTO")]
Goto = 6,
#[serde(rename = "IF")]
If = 7,
#[serde(rename = "ELSE")]
Else = 8,
#[serde(rename = "SWITCH")]
Switch = 9,
#[serde(rename = "TRY")]
Try = 10,
#[serde(rename = "THROW")]
Throw = 11,
#[serde(rename = "MATCH")]
Match = 12,
#[serde(rename = "YIELD")]
Yield = 13,
#[serde(rename = "CATCH")]
Catch = 14,
#[serde(rename = "FINALLY")]
Finally = 15,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_property_value_serialization() {
let string_value = PropertyValue {
value: Some(PropertyValueEnum::StringValue("test string".to_string())),
};
let serialized = serde_json::to_string(&string_value).unwrap();
let expected = r#"{"type":"string_value","value":"test string"}"#;
assert_eq!(serialized, expected);
let deserialized: PropertyValue = serde_json::from_str(expected).unwrap();
assert_eq!(deserialized, string_value);
}
#[test]
fn test_property_value_bool() {
let bool_value = PropertyValue {
value: Some(PropertyValueEnum::BoolValue(true)),
};
let serialized = serde_json::to_string(&bool_value).unwrap();
let expected = r#"{"type":"bool_value","value":true}"#;
assert_eq!(serialized, expected);
let deserialized: PropertyValue = serde_json::from_str(expected).unwrap();
assert_eq!(deserialized, bool_value);
}
#[test]
fn test_property_value_int() {
let int_value = PropertyValue {
value: Some(PropertyValueEnum::IntValue(42)),
};
let serialized = serde_json::to_string(&int_value).unwrap();
let expected = r#"{"type":"int_value","value":42}"#;
assert_eq!(serialized, expected);
let deserialized: PropertyValue = serde_json::from_str(expected).unwrap();
assert_eq!(deserialized, int_value);
}
#[test]
fn test_property_value_long() {
let long_value = PropertyValue {
value: Some(PropertyValueEnum::LongValue(9223372036854775807)),
};
let serialized = serde_json::to_string(&long_value).unwrap();
let expected = r#"{"type":"long_value","value":9223372036854775807}"#;
assert_eq!(serialized, expected);
let deserialized: PropertyValue = serde_json::from_str(expected).unwrap();
assert_eq!(deserialized, long_value);
}
#[test]
fn test_property_value_float() {
let float_value = PropertyValue {
value: Some(PropertyValueEnum::FloatValue(3.14)),
};
let serialized = serde_json::to_string(&float_value).unwrap();
let expected = r#"{"type":"float_value","value":3.14}"#;
assert_eq!(serialized, expected);
let deserialized: PropertyValue = serde_json::from_str(expected).unwrap();
assert_eq!(deserialized, float_value);
}
#[test]
fn test_property_value_double() {
let double_value = PropertyValue {
value: Some(PropertyValueEnum::DoubleValue(2.71828)),
};
let serialized = serde_json::to_string(&double_value).unwrap();
let expected = r#"{"type":"double_value","value":2.71828}"#;
assert_eq!(serialized, expected);
let deserialized: PropertyValue = serde_json::from_str(expected).unwrap();
assert_eq!(deserialized, double_value);
}
#[test]
fn test_property_value_string_list() {
let string_list = PropertyValue {
value: Some(PropertyValueEnum::StringList(StringList {
values: vec!["one".to_string(), "two".to_string(), "three".to_string()],
})),
};
let serialized = serde_json::to_string(&string_list).unwrap();
let expected = r#"{"type":"string_list","value":{"values":["one","two","three"]}}"#;
assert_eq!(serialized, expected);
let deserialized: PropertyValue = serde_json::from_str(expected).unwrap();
assert_eq!(deserialized, string_list);
}
#[test]
fn test_property_value_contained_refs() {
let contained_refs = PropertyValue {
value: Some(PropertyValueEnum::ContainedRefs(ContainedRefs {
local_name: "test_refs".to_string(),
refs: vec![1, 2, 3, 4],
})),
};
let serialized = serde_json::to_string(&contained_refs).unwrap();
let expected = r#"{"type":"contained_refs","value":{"local_name":"test_refs","refs":[1,2,3,4]}}"#;
assert_eq!(serialized, expected);
let deserialized: PropertyValue = serde_json::from_str(expected).unwrap();
assert_eq!(deserialized, contained_refs);
}
#[test]
fn test_node_serialization() {
let node = Node {
key: 123,
r#type: NodeType::Method,
property: vec![
NodeProperty {
name: NodePropertyName::Name,
value: Some(PropertyValue {
value: Some(PropertyValueEnum::StringValue("testMethod".to_string())),
}),
},
NodeProperty {
name: NodePropertyName::FullName,
value: Some(PropertyValue {
value: Some(PropertyValueEnum::StringValue("com.example.TestClass.testMethod".to_string())),
}),
},
],
};
let serialized = serde_json::to_string(&node).unwrap();
let deserialized: Node = serde_json::from_str(&serialized).unwrap();
assert_eq!(deserialized, node);
}
#[test]
fn test_edge_serialization() {
let edge = Edge {
src: 123,
dst: 456,
r#type: EdgeType::Ast,
property: vec![
EdgeProperty {
name: EdgePropertyName::Variable,
value: Some(PropertyValue {
value: Some(PropertyValueEnum::StringValue("testVar".to_string())),
}),
},
],
};
let serialized = serde_json::to_string(&edge).unwrap();
let deserialized: Edge = serde_json::from_str(&serialized).unwrap();
assert_eq!(deserialized, edge);
}
#[test]
fn test_cpg_struct_serialization() {
let cpg = Cpg {
node: vec![
Node {
key: 1,
r#type: NodeType::Method,
property: vec![
NodeProperty {
name: NodePropertyName::Name,
value: Some(PropertyValue {
value: Some(PropertyValueEnum::StringValue("main".to_string())),
}),
},
],
},
Node {
key: 2,
r#type: NodeType::MethodReturn,
property: vec![],
},
],
edge: vec![
Edge {
src: 1,
dst: 2,
r#type: EdgeType::Ast,
property: vec![],
},
],
};
let serialized = serde_json::to_string(&cpg).unwrap();
let deserialized: Cpg = serde_json::from_str(&serialized).unwrap();
assert_eq!(deserialized, cpg);
}
#[test]
fn test_diff_graph_serialization() {
let diff_graph = DiffGraph {
entries: vec![
DiffGraphEntry::Node(Node {
key: 1,
r#type: NodeType::Method,
property: vec![],
}),
DiffGraphEntry::Edge(Edge {
src: 1,
dst: 2,
r#type: EdgeType::Ast,
property: vec![],
}),
DiffGraphEntry::RemoveNode(RemoveNode {
key: 3,
}),
],
};
let serialized = serde_json::to_string(&diff_graph).unwrap();
let deserialized: DiffGraph = serde_json::from_str(&serialized).unwrap();
assert_eq!(deserialized, diff_graph);
}
#[test]
fn test_node_type_serialization() {
let node_type = NodeType::Method;
let serialized = serde_json::to_string(&node_type).unwrap();
assert_eq!(serialized, r#""METHOD""#);
let deserialized: NodeType = serde_json::from_str(&serialized).unwrap();
assert_eq!(deserialized, NodeType::Method);
}
#[test]
fn test_edge_type_serialization() {
let edge_type = EdgeType::Call;
let serialized = serde_json::to_string(&edge_type).unwrap();
assert_eq!(serialized, r#""CALL""#);
let deserialized: EdgeType = serde_json::from_str(&serialized).unwrap();
assert_eq!(deserialized, EdgeType::Call);
}
#[test]
fn test_property_value_none() {
let none_value = PropertyValue {
value: None,
};
let serialized = serde_json::to_string(&none_value).unwrap();
let expected = r#"{}"#;
assert_eq!(serialized, expected);
let deserialized: PropertyValue = serde_json::from_str(expected).unwrap();
assert_eq!(deserialized, none_value);
}
}