mirror of
https://github.com/rojo-rbx/rojo.git
synced 2026-04-25 15:16:07 +00:00
Port SnapshotDir tests to use insta snapshots
This commit is contained in:
@@ -25,12 +25,12 @@
|
|||||||
//! }
|
//! }
|
||||||
//! ```
|
//! ```
|
||||||
//!
|
//!
|
||||||
//! **The methods in this module can only handle relative paths, since absolute
|
//! For absolute paths, which are only safe to serialize if they're artificial,
|
||||||
//! paths are never portable.**
|
//! use `serialize_absolute`.
|
||||||
|
|
||||||
use std::path::{Component, Path};
|
use std::path::{Component, Path};
|
||||||
|
|
||||||
use serde::Serializer;
|
use serde::{ser::SerializeSeq, Serialize, Serializer};
|
||||||
|
|
||||||
pub fn serialize_option<S, T>(maybe_path: &Option<T>, serializer: S) -> Result<S::Ok, S::Error>
|
pub fn serialize_option<S, T>(maybe_path: &Option<T>, serializer: S) -> Result<S::Ok, S::Error>
|
||||||
where
|
where
|
||||||
@@ -72,3 +72,35 @@ where
|
|||||||
|
|
||||||
serializer.serialize_str(&output)
|
serializer.serialize_str(&output)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn serialize_absolute<S, T>(path: T, serializer: S) -> Result<S::Ok, S::Error>
|
||||||
|
where
|
||||||
|
S: Serializer,
|
||||||
|
T: AsRef<Path>,
|
||||||
|
{
|
||||||
|
let as_str = path
|
||||||
|
.as_ref()
|
||||||
|
.as_os_str()
|
||||||
|
.to_str()
|
||||||
|
.expect("Invalid Unicode in file path, cannot serialize");
|
||||||
|
let replaced = as_str.replace("\\", "/");
|
||||||
|
|
||||||
|
serializer.serialize_str(&replaced)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Serialize)]
|
||||||
|
struct WithAbsolute<'a>(#[serde(serialize_with = "serialize_absolute")] &'a Path);
|
||||||
|
|
||||||
|
pub fn serialize_vec_absolute<S, T>(paths: &Vec<T>, serializer: S) -> Result<S::Ok, S::Error>
|
||||||
|
where
|
||||||
|
S: Serializer,
|
||||||
|
T: AsRef<Path>,
|
||||||
|
{
|
||||||
|
let mut seq = serializer.serialize_seq(Some(paths.len()))?;
|
||||||
|
|
||||||
|
for path in paths {
|
||||||
|
seq.serialize_element(&WithAbsolute(path.as_ref()))?;
|
||||||
|
}
|
||||||
|
|
||||||
|
seq.end()
|
||||||
|
}
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ use std::path::PathBuf;
|
|||||||
|
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
use crate::project::ProjectNode;
|
use crate::{path_serializer, 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.
|
||||||
@@ -33,6 +33,7 @@ pub struct InstanceMetadata {
|
|||||||
/// This path is used to make sure that file changes update all instances
|
/// This path is used to make sure that file changes update all instances
|
||||||
/// that may need updates.
|
/// that may need updates.
|
||||||
// TODO: Change this to be a SmallVec for performance in common cases?
|
// TODO: Change this to be a SmallVec for performance in common cases?
|
||||||
|
#[serde(serialize_with = "path_serializer::serialize_vec_absolute")]
|
||||||
pub contributing_paths: Vec<PathBuf>,
|
pub contributing_paths: Vec<PathBuf>,
|
||||||
|
|
||||||
/// If this instance was defined in a project file, this is the name from
|
/// If this instance was defined in a project file, this is the name from
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ use rbx_dom_weak::{RbxId, RbxTree};
|
|||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
imfs::{DirectorySnapshot, Imfs, ImfsEntry, ImfsFetcher, ImfsSnapshot},
|
imfs::{DirectorySnapshot, Imfs, ImfsEntry, ImfsFetcher, ImfsSnapshot},
|
||||||
snapshot::InstanceSnapshot,
|
snapshot::{InstanceMetadata, InstanceSnapshot},
|
||||||
};
|
};
|
||||||
|
|
||||||
use super::{
|
use super::{
|
||||||
@@ -43,7 +43,10 @@ impl SnapshotMiddleware for SnapshotDir {
|
|||||||
|
|
||||||
Ok(Some(InstanceSnapshot {
|
Ok(Some(InstanceSnapshot {
|
||||||
snapshot_id: None,
|
snapshot_id: None,
|
||||||
metadata: Default::default(), // TODO
|
metadata: InstanceMetadata {
|
||||||
|
contributing_paths: vec![entry.path().to_path_buf()],
|
||||||
|
..Default::default()
|
||||||
|
},
|
||||||
name: Cow::Owned(instance_name),
|
name: Cow::Owned(instance_name),
|
||||||
class_name: Cow::Borrowed("Folder"),
|
class_name: Cow::Borrowed("Folder"),
|
||||||
properties: HashMap::new(),
|
properties: HashMap::new(),
|
||||||
@@ -76,6 +79,7 @@ impl SnapshotMiddleware for SnapshotDir {
|
|||||||
mod test {
|
mod test {
|
||||||
use super::*;
|
use super::*;
|
||||||
|
|
||||||
|
use insta::assert_yaml_snapshot;
|
||||||
use maplit::hashmap;
|
use maplit::hashmap;
|
||||||
|
|
||||||
use crate::imfs::{ImfsDebug, NoopFetcher};
|
use crate::imfs::{ImfsDebug, NoopFetcher};
|
||||||
@@ -90,10 +94,7 @@ mod test {
|
|||||||
let entry = imfs.get("/foo").unwrap();
|
let entry = imfs.get("/foo").unwrap();
|
||||||
let instance_snapshot = SnapshotDir::from_imfs(&mut imfs, &entry).unwrap().unwrap();
|
let instance_snapshot = SnapshotDir::from_imfs(&mut imfs, &entry).unwrap().unwrap();
|
||||||
|
|
||||||
assert_eq!(instance_snapshot.name, "foo");
|
assert_yaml_snapshot!(instance_snapshot);
|
||||||
assert_eq!(instance_snapshot.class_name, "Folder");
|
|
||||||
assert_eq!(instance_snapshot.properties, HashMap::new());
|
|
||||||
assert_eq!(instance_snapshot.children, Vec::new());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
@@ -108,15 +109,6 @@ mod test {
|
|||||||
let entry = imfs.get("/foo").unwrap();
|
let entry = imfs.get("/foo").unwrap();
|
||||||
let instance_snapshot = SnapshotDir::from_imfs(&mut imfs, &entry).unwrap().unwrap();
|
let instance_snapshot = SnapshotDir::from_imfs(&mut imfs, &entry).unwrap().unwrap();
|
||||||
|
|
||||||
assert_eq!(instance_snapshot.name, "foo");
|
assert_yaml_snapshot!(instance_snapshot);
|
||||||
assert_eq!(instance_snapshot.class_name, "Folder");
|
|
||||||
assert_eq!(instance_snapshot.properties, HashMap::new());
|
|
||||||
assert_eq!(instance_snapshot.children.len(), 1);
|
|
||||||
|
|
||||||
let child = &instance_snapshot.children[0];
|
|
||||||
assert_eq!(child.name, "Child");
|
|
||||||
assert_eq!(child.class_name, "Folder");
|
|
||||||
assert_eq!(child.properties, HashMap::new());
|
|
||||||
assert_eq!(child.children, Vec::new());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
14
src/snapshot_middleware/snapshots/test__empty_folder.snap
Normal file
14
src/snapshot_middleware/snapshots/test__empty_folder.snap
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
---
|
||||||
|
source: src/snapshot_middleware/dir.rs
|
||||||
|
expression: instance_snapshot
|
||||||
|
---
|
||||||
|
snapshot_id: ~
|
||||||
|
metadata:
|
||||||
|
ignore_unknown_instances: false
|
||||||
|
contributing_paths:
|
||||||
|
- /foo
|
||||||
|
project_node: ~
|
||||||
|
name: foo
|
||||||
|
class_name: Folder
|
||||||
|
properties: {}
|
||||||
|
children: []
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
---
|
||||||
|
source: src/snapshot_middleware/dir.rs
|
||||||
|
expression: instance_snapshot
|
||||||
|
---
|
||||||
|
snapshot_id: ~
|
||||||
|
metadata:
|
||||||
|
ignore_unknown_instances: false
|
||||||
|
contributing_paths:
|
||||||
|
- /foo
|
||||||
|
project_node: ~
|
||||||
|
name: foo
|
||||||
|
class_name: Folder
|
||||||
|
properties: {}
|
||||||
|
children:
|
||||||
|
- snapshot_id: ~
|
||||||
|
metadata:
|
||||||
|
ignore_unknown_instances: false
|
||||||
|
contributing_paths:
|
||||||
|
- /foo/Child
|
||||||
|
project_node: ~
|
||||||
|
name: Child
|
||||||
|
class_name: Folder
|
||||||
|
properties: {}
|
||||||
|
children: []
|
||||||
Reference in New Issue
Block a user