local fs = require("@lune/fs")
local roblox = require("@lune/roblox")
local Instance = roblox.Instance

-- Smoke tests
do
	local game = Instance.new("DataModel")

	local workspace = game:GetService("Workspace")

	local model = Instance.new("Model")
	local part = Instance.new("Part")

	part.Parent = model
	model.Parent = workspace

	local placeAsBinary = roblox.serializePlace(game)
	local placeAsXml = roblox.serializePlace(game, true)

	fs.writeFile("bin/temp-place.rbxl", placeAsBinary)
	fs.writeFile("bin/temp-place.rbxlx", placeAsXml)

	local savedFileBinary = fs.readFile("bin/temp-place.rbxl")
	local savedFileXml = fs.readFile("bin/temp-place.rbxlx")

	local savedBinary = roblox.deserializePlace(savedFileBinary)
	local savedXml = roblox.deserializePlace(savedFileXml)

	assert(savedBinary.Name ~= "ROOT")
	assert(savedXml.Name ~= "ROOT")

	assert(savedBinary.ClassName == "DataModel")
	assert(savedXml.ClassName == "DataModel")
end

-- Ensure Ref properties are preserved across services
do
	local game = Instance.new("DataModel")
	local ReplicatedStorage = Instance.new("ReplicatedStorage")
	local Workspace = Instance.new("Workspace")

	Workspace.Parent = game
	ReplicatedStorage.Parent = game

	local part = Instance.new("Part")
	part.Parent = ReplicatedStorage

	local objectValue = Instance.new("ObjectValue") :: any
	objectValue.Value = part
	objectValue.Parent = Workspace

	local serialized = roblox.serializePlace(game)
	local deserialized = roblox.deserializePlace(serialized) :: any

	assert(deserialized.Workspace.ObjectValue.Value == deserialized.ReplicatedStorage.Part)
end