forked from rojo-rbx/rojo
First round of snapshot tests for patch_compute
This commit is contained in:
1
Cargo.lock
generated
1
Cargo.lock
generated
@@ -1460,6 +1460,7 @@ dependencies = [
|
|||||||
"futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)",
|
"futures 0.1.28 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"humantime 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"humantime 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"hyper 0.12.33 (registry+https://github.com/rust-lang/crates.io-index)",
|
"hyper 0.12.33 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"insta 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"jod-thread 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"jod-thread 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
"log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
|||||||
@@ -68,8 +68,13 @@ winreg = "0.6.2"
|
|||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
rojo-insta-ext = { path = "rojo-insta-ext" }
|
rojo-insta-ext = { path = "rojo-insta-ext" }
|
||||||
|
|
||||||
lazy_static = "1.2"
|
lazy_static = "1.2"
|
||||||
paste = "0.1"
|
paste = "0.1"
|
||||||
pretty_assertions = "0.6.1"
|
pretty_assertions = "0.6.1"
|
||||||
tempfile = "3.0"
|
tempfile = "3.0"
|
||||||
walkdir = "2.1"
|
walkdir = "2.1"
|
||||||
|
|
||||||
|
[dev-dependencies.insta]
|
||||||
|
version = "0.11.0"
|
||||||
|
features = ["redactions"]
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
use std::{borrow::Cow, collections::HashMap};
|
use std::{borrow::Cow, collections::HashMap};
|
||||||
|
|
||||||
use rbx_dom_weak::{RbxId, RbxTree, RbxValue};
|
use rbx_dom_weak::{RbxId, RbxTree, RbxValue};
|
||||||
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
use super::InstanceMetadata;
|
use super::InstanceMetadata;
|
||||||
|
|
||||||
@@ -13,7 +14,7 @@ use super::InstanceMetadata;
|
|||||||
// Possible future improvements:
|
// Possible future improvements:
|
||||||
// - Use refcounted/interned strings
|
// - Use refcounted/interned strings
|
||||||
// - Replace use of RbxValue with a sum of RbxValue + borrowed value
|
// - Replace use of RbxValue with a sum of RbxValue + borrowed value
|
||||||
#[derive(Debug, Clone, PartialEq)]
|
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
|
||||||
pub struct InstanceSnapshot<'source> {
|
pub struct InstanceSnapshot<'source> {
|
||||||
/// A temporary ID applied to the snapshot that's used for Ref properties.
|
/// A temporary ID applied to the snapshot that's used for Ref properties.
|
||||||
pub snapshot_id: Option<RbxId>,
|
pub snapshot_id: Option<RbxId>,
|
||||||
|
|||||||
@@ -1,10 +1,12 @@
|
|||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
|
|
||||||
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
use crate::project::ProjectNode;
|
use crate::project::ProjectNode;
|
||||||
|
|
||||||
/// Rojo-specific metadata that can be associated with an instance or a snapshot
|
/// Rojo-specific metadata that can be associated with an instance or a snapshot
|
||||||
/// of an instance.
|
/// of an instance.
|
||||||
#[derive(Debug, Clone, PartialEq)]
|
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
|
||||||
pub struct InstanceMetadata {
|
pub struct InstanceMetadata {
|
||||||
/// Whether instances not present in the source should be ignored when
|
/// Whether instances not present in the source should be ignored when
|
||||||
/// live-syncing. This is useful when there are instances that Rojo does not
|
/// live-syncing. This is useful when there are instances that Rojo does not
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
|
|
||||||
use rbx_dom_weak::{RbxId, RbxValue};
|
use rbx_dom_weak::{RbxId, RbxValue};
|
||||||
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
use super::{InstanceMetadata, InstanceSnapshot};
|
use super::{InstanceMetadata, InstanceSnapshot};
|
||||||
|
|
||||||
@@ -11,7 +12,7 @@ use super::{InstanceMetadata, InstanceSnapshot};
|
|||||||
/// These patches shouldn't be persisted: there's no mechanism in place to make
|
/// These patches shouldn't be persisted: there's no mechanism in place to make
|
||||||
/// sure that another patch wasn't applied before this one that could cause a
|
/// sure that another patch wasn't applied before this one that could cause a
|
||||||
/// conflict!
|
/// conflict!
|
||||||
#[derive(Debug, Default, Clone, PartialEq)]
|
#[derive(Debug, Default, Clone, PartialEq, Serialize, Deserialize)]
|
||||||
pub struct PatchSet<'a> {
|
pub struct PatchSet<'a> {
|
||||||
pub removed_instances: Vec<RbxId>,
|
pub removed_instances: Vec<RbxId>,
|
||||||
pub added_instances: Vec<PatchAdd<'a>>,
|
pub added_instances: Vec<PatchAdd<'a>>,
|
||||||
@@ -29,14 +30,14 @@ impl<'a> PatchSet<'a> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// A patch containing an instance that was added to the tree.
|
/// A patch containing an instance that was added to the tree.
|
||||||
#[derive(Debug, Clone, PartialEq)]
|
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
|
||||||
pub struct PatchAdd<'a> {
|
pub struct PatchAdd<'a> {
|
||||||
pub parent_id: RbxId,
|
pub parent_id: RbxId,
|
||||||
pub instance: InstanceSnapshot<'a>,
|
pub instance: InstanceSnapshot<'a>,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// A patch indicating that properties of an instance changed.
|
/// A patch indicating that properties of an instance changed.
|
||||||
#[derive(Debug, Clone, PartialEq)]
|
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
|
||||||
pub struct PatchUpdate {
|
pub struct PatchUpdate {
|
||||||
pub id: RbxId,
|
pub id: RbxId,
|
||||||
pub changed_name: Option<String>,
|
pub changed_name: Option<String>,
|
||||||
|
|||||||
@@ -1,14 +1,21 @@
|
|||||||
use std::borrow::Cow;
|
use std::borrow::Cow;
|
||||||
|
|
||||||
use rbx_dom_weak::RbxInstanceProperties;
|
use insta::assert_yaml_snapshot;
|
||||||
|
use maplit::hashmap;
|
||||||
|
use rbx_dom_weak::{RbxInstanceProperties, RbxValue};
|
||||||
|
|
||||||
|
use rojo_insta_ext::RedactionMap;
|
||||||
|
|
||||||
use crate::snapshot::{compute_patch_set, InstancePropertiesWithMeta, InstanceSnapshot, RojoTree};
|
use crate::snapshot::{compute_patch_set, InstancePropertiesWithMeta, InstanceSnapshot, RojoTree};
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn reify_folder() {
|
fn set_name_and_class_name() {
|
||||||
let tree = empty_tree();
|
let mut redactions = RedactionMap::new();
|
||||||
|
|
||||||
let folder = InstanceSnapshot {
|
let tree = empty_tree();
|
||||||
|
redactions.intern(tree.get_root_id());
|
||||||
|
|
||||||
|
let snapshot = InstanceSnapshot {
|
||||||
snapshot_id: None,
|
snapshot_id: None,
|
||||||
metadata: Default::default(),
|
metadata: Default::default(),
|
||||||
name: Cow::Borrowed("Some Folder"),
|
name: Cow::Borrowed("Some Folder"),
|
||||||
@@ -17,10 +24,69 @@ fn reify_folder() {
|
|||||||
children: Vec::new(),
|
children: Vec::new(),
|
||||||
};
|
};
|
||||||
|
|
||||||
let _patch_set = compute_patch_set(&folder, &tree, tree.get_root_id());
|
let patch_set = compute_patch_set(&snapshot, &tree, tree.get_root_id());
|
||||||
|
let patch_value = redactions.redacted_yaml(patch_set);
|
||||||
|
|
||||||
// TODO: Make assertions about patch set using snapshots. This needs patches
|
assert_yaml_snapshot!(patch_value);
|
||||||
// to be serializable and also to have ID redactions more readily available.
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn set_property() {
|
||||||
|
let mut redactions = RedactionMap::new();
|
||||||
|
|
||||||
|
let tree = empty_tree();
|
||||||
|
redactions.intern(tree.get_root_id());
|
||||||
|
|
||||||
|
let snapshot = InstanceSnapshot {
|
||||||
|
snapshot_id: None,
|
||||||
|
metadata: Default::default(),
|
||||||
|
name: Cow::Borrowed("ROOT"),
|
||||||
|
class_name: Cow::Borrowed("ROOT"),
|
||||||
|
properties: hashmap! {
|
||||||
|
"PropertyName".to_owned() => RbxValue::String {
|
||||||
|
value: "Hello, world!".to_owned(),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
children: Vec::new(),
|
||||||
|
};
|
||||||
|
|
||||||
|
let patch_set = compute_patch_set(&snapshot, &tree, tree.get_root_id());
|
||||||
|
let patch_value = redactions.redacted_yaml(patch_set);
|
||||||
|
|
||||||
|
assert_yaml_snapshot!(patch_value);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn remove_property() {
|
||||||
|
let mut redactions = RedactionMap::new();
|
||||||
|
|
||||||
|
let mut tree = empty_tree();
|
||||||
|
redactions.intern(tree.get_root_id());
|
||||||
|
|
||||||
|
{
|
||||||
|
let root_id = tree.get_root_id();
|
||||||
|
let mut root_instance = tree.get_instance_mut(root_id).unwrap();
|
||||||
|
root_instance.properties_mut().insert(
|
||||||
|
"Foo".to_owned(),
|
||||||
|
RbxValue::String {
|
||||||
|
value: "This should be removed by the patch.".to_owned(),
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
let snapshot = InstanceSnapshot {
|
||||||
|
snapshot_id: None,
|
||||||
|
metadata: Default::default(),
|
||||||
|
name: Cow::Borrowed("ROOT"),
|
||||||
|
class_name: Cow::Borrowed("ROOT"),
|
||||||
|
properties: Default::default(),
|
||||||
|
children: Vec::new(),
|
||||||
|
};
|
||||||
|
|
||||||
|
let patch_set = compute_patch_set(&snapshot, &tree, tree.get_root_id());
|
||||||
|
let patch_value = redactions.redacted_yaml(patch_set);
|
||||||
|
|
||||||
|
assert_yaml_snapshot!(patch_value);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn empty_tree() -> RojoTree {
|
fn empty_tree() -> RojoTree {
|
||||||
|
|||||||
13
src/snapshot/tests/snapshots/compute__remove_property.snap
Normal file
13
src/snapshot/tests/snapshots/compute__remove_property.snap
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
---
|
||||||
|
source: src/snapshot/tests/compute.rs
|
||||||
|
expression: patch_value
|
||||||
|
---
|
||||||
|
removed_instances: []
|
||||||
|
added_instances: []
|
||||||
|
updated_instances:
|
||||||
|
- id: id-1
|
||||||
|
changed_name: ~
|
||||||
|
changed_class_name: ~
|
||||||
|
changed_properties:
|
||||||
|
Foo: ~
|
||||||
|
changed_metadata: ~
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
---
|
||||||
|
source: src/snapshot/tests/compute.rs
|
||||||
|
expression: patch_value
|
||||||
|
---
|
||||||
|
removed_instances: []
|
||||||
|
added_instances: []
|
||||||
|
updated_instances:
|
||||||
|
- id: id-1
|
||||||
|
changed_name: Some Folder
|
||||||
|
changed_class_name: Folder
|
||||||
|
changed_properties: {}
|
||||||
|
changed_metadata: ~
|
||||||
15
src/snapshot/tests/snapshots/compute__set_property.snap
Normal file
15
src/snapshot/tests/snapshots/compute__set_property.snap
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
---
|
||||||
|
source: src/snapshot/tests/compute.rs
|
||||||
|
expression: patch_value
|
||||||
|
---
|
||||||
|
removed_instances: []
|
||||||
|
added_instances: []
|
||||||
|
updated_instances:
|
||||||
|
- id: id-1
|
||||||
|
changed_name: ~
|
||||||
|
changed_class_name: ~
|
||||||
|
changed_properties:
|
||||||
|
PropertyName:
|
||||||
|
Type: String
|
||||||
|
Value: "Hello, world!"
|
||||||
|
changed_metadata: ~
|
||||||
Reference in New Issue
Block a user