1
0
Fork 0
mirror of https://codeberg.org/demostf/parser.git synced 2026-06-03 10:14:06 +02:00

add basic snapshot testing

This commit is contained in:
Robin Appelman 2019-03-17 19:20:50 +01:00
commit 052ff398cd
15 changed files with 134 additions and 25 deletions

69
Cargo.lock generated
View file

@ -1,5 +1,13 @@
# This file is automatically @generated by Cargo. # This file is automatically @generated by Cargo.
# It is not intended for manual editing. # It is not intended for manual editing.
[[package]]
name = "ansi_term"
version = "0.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]] [[package]]
name = "bitstream_reader" name = "bitstream_reader"
version = "0.4.0" version = "0.4.0"
@ -22,6 +30,20 @@ name = "byteorder"
version = "1.3.1" version = "1.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "ctor"
version = "0.1.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)",
"syn 0.15.27 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "difference"
version = "2.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]] [[package]]
name = "enum-primitive-derive" name = "enum-primitive-derive"
version = "0.1.2" version = "0.1.2"
@ -70,6 +92,25 @@ name = "num-traits"
version = "0.2.6" version = "0.2.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "output_vt100"
version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "pretty_assertions"
version = "0.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
"ctor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
"difference 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
"output_vt100 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]] [[package]]
name = "proc-macro2" name = "proc-macro2"
version = "0.4.27" version = "0.4.27"
@ -180,6 +221,7 @@ dependencies = [
"enumflags2 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "enumflags2 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
"enumflags2_derive 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "enumflags2_derive 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
"num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)",
"pretty_assertions 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)",
"serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)",
"serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)",
"serde_repr 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", "serde_repr 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
@ -196,8 +238,30 @@ name = "unicode-xid"
version = "0.1.0" version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "winapi"
version = "0.3.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
"winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "winapi-i686-pc-windows-gnu"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "winapi-x86_64-pc-windows-gnu"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
[metadata] [metadata]
"checksum ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b"
"checksum byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a019b10a2a7cdeb292db131fc8113e57ea2a908f6e7894b0c3c671893b65dbeb" "checksum byteorder 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a019b10a2a7cdeb292db131fc8113e57ea2a908f6e7894b0c3c671893b65dbeb"
"checksum ctor 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "9a43db2bba5cafdc6aa068c892a518e477ee0df3705e53ec70247a9ff93546d5"
"checksum difference 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "524cbf6897b527295dff137cec09ecf3a05f4fddffd7dfcd1585403449e74198"
"checksum enum-primitive-derive 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e2b90e520ec62c1864c8c78d637acbfe8baf5f63240f2fb8165b8325c07812dd" "checksum enum-primitive-derive 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e2b90e520ec62c1864c8c78d637acbfe8baf5f63240f2fb8165b8325c07812dd"
"checksum enumflags2 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "801303a673e02d2110a196d70e4a807f0ff0a68ce1060eebc1e6a0d598db65e8" "checksum enumflags2 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "801303a673e02d2110a196d70e4a807f0ff0a68ce1060eebc1e6a0d598db65e8"
"checksum enumflags2_derive 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9e015b3dfedc096cb55cdc5d022d6b4e6b94547212fb94ad2d9ece20bcd88fe3" "checksum enumflags2_derive 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9e015b3dfedc096cb55cdc5d022d6b4e6b94547212fb94ad2d9ece20bcd88fe3"
@ -205,6 +269,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
"checksum lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bc5729f27f159ddd61f4df6228e827e86643d4d3e7c32183cb30a1c08f604a14" "checksum lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bc5729f27f159ddd61f4df6228e827e86643d4d3e7c32183cb30a1c08f604a14"
"checksum num-traits 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)" = "92e5113e9fd4cc14ded8e499429f396a20f98c772a47cc8622a736e1ec843c31" "checksum num-traits 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)" = "92e5113e9fd4cc14ded8e499429f396a20f98c772a47cc8622a736e1ec843c31"
"checksum num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "0b3a5d7cc97d6d30d8b9bc8fa19bf45349ffe46241e8816f50f62f6d6aaabee1" "checksum num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "0b3a5d7cc97d6d30d8b9bc8fa19bf45349ffe46241e8816f50f62f6d6aaabee1"
"checksum output_vt100 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "53cdc5b785b7a58c5aad8216b3dfa114df64b0b06ae6e1501cef91df2fbdf8f9"
"checksum pretty_assertions 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3f81e1644e1b54f5a68959a29aa86cde704219254669da328ecfdf6a1f09d427"
"checksum proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)" = "4d317f9caece796be1980837fd5cb3dfec5613ebdb04ad0956deea83ce168915" "checksum proc-macro2 0.4.27 (registry+https://github.com/rust-lang/crates.io-index)" = "4d317f9caece796be1980837fd5cb3dfec5613ebdb04ad0956deea83ce168915"
"checksum quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6e920b65c65f10b2ae65c831a81a073a89edd28c7cce89475bff467ab4167a" "checksum quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6e920b65c65f10b2ae65c831a81a073a89edd28c7cce89475bff467ab4167a"
"checksum quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)" = "cdd8e04bd9c52e0342b406469d494fcb033be4bdbe5c606016defbb1681411e1" "checksum quote 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)" = "cdd8e04bd9c52e0342b406469d494fcb033be4bdbe5c606016defbb1681411e1"
@ -219,3 +285,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
"checksum synom 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a393066ed9010ebaed60b9eafa373d4b1baac186dd7e008555b0f702b51945b6" "checksum synom 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a393066ed9010ebaed60b9eafa373d4b1baac186dd7e008555b0f702b51945b6"
"checksum unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f860d7d29cf02cb2f3f359fd35991af3d30bac52c57d265a3c461074cb4dc" "checksum unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f860d7d29cf02cb2f3f359fd35991af3d30bac52c57d265a3c461074cb4dc"
"checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" "checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc"
"checksum winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "92c1eb33641e276cfa214a0522acad57be5c56b10cb348b3c5117db75f3ac4b0"
"checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
"checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"

View file

@ -21,3 +21,6 @@ snap = "0.2"
serde = { version = "1.0", features = ["derive"] } serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0" serde_json = "1.0"
serde_repr = "0.1" serde_repr = "0.1"
[dev-dependencies]
pretty_assertions = "0.6.1"

2
data/.gitignore vendored
View file

@ -1 +1,3 @@
!small.dem !small.dem
!gully.dem
!comp.dem

BIN
data/comp.dem Normal file

Binary file not shown.

1
data/comp.json Normal file

File diff suppressed because one or more lines are too long

BIN
data/gully.dem Normal file

Binary file not shown.

1
data/gully.json Normal file

File diff suppressed because one or more lines are too long

1
data/small.json Normal file
View file

@ -0,0 +1 @@
{"chat":[],"users":{"2":{"classes":{},"name":"Icewind | demos.tf","userId":2,"steamId":"[U:1:64229260]","team":"Other"}},"deaths":[],"rounds":[],"startTick":0,"intervalPerTick":0.015}

View file

@ -1,12 +1,12 @@
use bitstream_reader::BitRead; use bitstream_reader::BitRead;
use serde::Serialize; use serde::{Serialize, Deserialize};
use crate::{Parse, ParserState, Result, Stream, ParseError}; use crate::{Parse, ParserState, Result, Stream, ParseError};
use crate::demo::packet::datatable::ServerClass; use crate::demo::packet::datatable::ServerClass;
use crate::demo::sendprop::SendProp; use crate::demo::sendprop::SendProp;
use crate::demo::parser::ParseBitSkip; use crate::demo::parser::ParseBitSkip;
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash, Serialize)] #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub struct EntityId(u32); pub struct EntityId(u32);
impl EntityId { impl EntityId {

View file

@ -1,7 +1,7 @@
use bitstream_reader::{BitRead, BitSkip, LittleEndian}; use bitstream_reader::{BitRead, LittleEndian};
use enum_primitive_derive::Primitive; use enum_primitive_derive::Primitive;
use num_traits::FromPrimitive; use num_traits::FromPrimitive;
use serde::Serialize; use serde::{Serialize, Deserialize};
use crate::{ReadResult, Stream, Result, ParseError}; use crate::{ReadResult, Stream, Result, ParseError};
use crate::demo::parser::ParseBitSkip; use crate::demo::parser::ParseBitSkip;
@ -108,7 +108,7 @@ impl ParseBitSkip for UserMessage {
} }
#[derive(Debug, Clone, Serialize)] #[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub enum ChatMessageKind { pub enum ChatMessageKind {
#[serde(rename = "TF_Chat_All")] #[serde(rename = "TF_Chat_All")]
ChatAll, ChatAll,

View file

@ -1,7 +1,7 @@
use std::collections::HashMap; use std::collections::HashMap;
use serde::Serialize; use serde::{Serialize, Deserialize};
use serde_repr::Serialize_repr; use serde_repr::{Serialize_repr, Deserialize_repr};
use crate::demo::gameevent_gen::{ use crate::demo::gameevent_gen::{
GameEvent, PlayerDeathEvent, PlayerSpawnEvent, TeamPlayRoundWinEvent, GameEvent, PlayerDeathEvent, PlayerSpawnEvent, TeamPlayRoundWinEvent,
@ -14,7 +14,7 @@ use crate::demo::parser::handler::{MessageHandler, StringTableEntryHandler};
use crate::demo::vector::Vector; use crate::demo::vector::Vector;
use crate::{ParserState, ReadResult, Stream}; use crate::{ParserState, ReadResult, Stream};
#[derive(Debug, Clone, Serialize)] #[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct ChatMassage { pub struct ChatMassage {
pub kind: ChatMessageKind, pub kind: ChatMessageKind,
pub from: String, pub from: String,
@ -33,7 +33,7 @@ impl ChatMassage {
} }
} }
#[derive(Debug, Clone, Serialize, Copy, PartialEq, Eq, Hash)] #[derive(Debug, Clone, Serialize, Deserialize, Copy, PartialEq, Eq, Hash)]
pub enum Team { pub enum Team {
Other = 0, Other = 0,
Spectator = 1, Spectator = 1,
@ -54,7 +54,7 @@ impl Team {
} }
} }
#[derive(Debug, Clone, Serialize_repr, Copy, PartialEq, Eq, Hash)] #[derive(Debug, Clone, Serialize_repr, Deserialize_repr, Copy, PartialEq, Eq, Hash)]
#[repr(u8)] #[repr(u8)]
pub enum Class { pub enum Class {
Other = 0, Other = 0,
@ -86,10 +86,10 @@ impl Class {
} }
} }
#[derive(Debug, Clone, Serialize, Copy, PartialEq, Eq, Hash)] #[derive(Debug, Clone, Serialize, Deserialize, Copy, PartialEq, Eq, Hash)]
pub struct UserId(u8); pub struct UserId(u8);
#[derive(Debug, Clone, Serialize)] #[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct Spawn { pub struct Spawn {
pub user: UserId, pub user: UserId,
pub class: Class, pub class: Class,
@ -108,7 +108,7 @@ impl Spawn {
} }
} }
#[derive(Debug, Clone, Serialize)] #[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct UserInfo { pub struct UserInfo {
pub name: String, pub name: String,
pub user_id: UserId, pub user_id: UserId,
@ -116,7 +116,7 @@ pub struct UserInfo {
pub entity_id: EntityId, pub entity_id: EntityId,
} }
#[derive(Debug, Clone, Serialize)] #[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct Death { pub struct Death {
pub weapon: String, pub weapon: String,
pub victim: UserId, pub victim: UserId,
@ -142,7 +142,7 @@ impl Death {
} }
} }
#[derive(Debug, Clone, Serialize)] #[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct Round { pub struct Round {
winner: Team, winner: Team,
length: f32, length: f32,
@ -159,13 +159,13 @@ impl Round {
} }
} }
#[derive(Default, Debug, Serialize)] #[derive(Default, Debug, Serialize, Deserialize, PartialEq)]
pub struct World { pub struct World {
boundary_min: Vector, boundary_min: Vector,
boundary_max: Vector, boundary_max: Vector,
} }
#[derive(Default, Debug, Serialize)] #[derive(Default, Debug, Serialize, Deserialize, PartialEq)]
pub struct Analyser { pub struct Analyser {
pub chat: Vec<ChatMassage>, pub chat: Vec<ChatMassage>,
pub users: HashMap<UserId, UserInfo>, pub users: HashMap<UserId, UserInfo>,
@ -287,7 +287,7 @@ impl Analyser {
} }
} }
#[derive(Debug, Serialize)] #[derive(Debug, Serialize, Deserialize, PartialEq)]
pub struct UserState { pub struct UserState {
pub classes: HashMap<Class, u8>, pub classes: HashMap<Class, u8>,
pub name: String, pub name: String,
@ -330,7 +330,7 @@ impl UserState {
} }
} }
#[derive(Debug, Serialize)] #[derive(Debug, Serialize, Deserialize, PartialEq)]
pub struct MatchState { pub struct MatchState {
pub chat: Vec<ChatMassage>, pub chat: Vec<ChatMassage>,
pub users: HashMap<UserId, UserState>, pub users: HashMap<UserId, UserState>,

View file

@ -3,7 +3,7 @@ use bitstream_reader::{BitRead, BitSkip, LittleEndian, ReadError};
use crate::demo::gamevent::{GameEventValue, GameEventValueType}; use crate::demo::gamevent::{GameEventValue, GameEventValueType};
use crate::demo::header::Header; use crate::demo::header::Header;
use crate::demo::packet::Packet; use crate::demo::packet::Packet;
use crate::demo::parser::analyser::MatchState; pub use crate::demo::parser::analyser::MatchState;
use crate::demo::parser::handler::DemoHandler; use crate::demo::parser::handler::DemoHandler;
pub use crate::demo::parser::state::ParserState; pub use crate::demo::parser::state::ParserState;
use crate::Stream; use crate::Stream;

View file

@ -1,14 +1,14 @@
use bitstream_reader::{BitRead, BitSize}; use bitstream_reader::{BitRead, BitSize};
use serde::Serialize; use serde::{Serialize, Deserialize};
#[derive(BitRead, BitSize, Debug, Clone, Copy, Default, Serialize)] #[derive(BitRead, BitSize, Debug, Clone, Copy, Default, Serialize, Deserialize, PartialEq)]
pub struct Vector { pub struct Vector {
pub x: f32, pub x: f32,
pub y: f32, pub y: f32,
pub z: f32, pub z: f32,
} }
#[derive(BitRead, BitSize, Debug, Clone, Copy, Default, Serialize)] #[derive(BitRead, BitSize, Debug, Clone, Copy, Default, Serialize, Deserialize, PartialEq)]
pub struct VectorXY { pub struct VectorXY {
pub x: f32, pub x: f32,
pub y: f32, pub y: f32,

View file

@ -1,5 +1,7 @@
pub use crate::demo::{ pub use crate::demo::{
parser::{DemoParser, Parse, ParseError, ParserState, Result}, parser::{
DemoParser, Parse, ParseError, ParserState, Result, MatchState
},
Demo, Stream, Demo, Stream,
}; };

30
tests/tests.rs Normal file
View file

@ -0,0 +1,30 @@
use std::fs;
use pretty_assertions::assert_eq;
use tf_demo_parser::{Demo, DemoParser, Stream, MatchState};
fn snapshot_test(input_file: &str, snapshot_file: &str) {
let file = fs::read(input_file).expect("Unable to read file");
let demo = Demo::new(file);
let stream: Stream = demo.get_stream();
let parser = DemoParser::new(stream);
let (_, state) = parser.parse_demo().unwrap();
let expected: MatchState = serde_json::from_slice(fs::read(snapshot_file).expect("Unable to read file").as_slice()).unwrap();
assert_eq!(expected, state);
}
#[test]
fn snapshot_test_small() {
snapshot_test("data/small.dem", "data/small.json");
}
#[test]
fn snapshot_test_gully() {
snapshot_test("data/gully.dem", "data/gully.json");
}
#[test]
fn snapshot_test_comp() {
snapshot_test("data/comp.dem", "data/comp.json");
}