namespace SceneTests.GameObjects;
///
/// Pins GameObjectFlags behaviour: bitwise add/remove via the Flags property,
/// the IsDeserializing convenience accessor, and HasFlagOrParent walking the
/// ancestor chain.
///
[TestClass]
[DoNotParallelize]
public class GameObjectFlagsTest : SceneTest
{
///
/// Flags start at None, and can be set and cleared independently of each
/// other with the usual bitwise operations.
///
[TestMethod]
public void FlagsAddAndRemove()
{
var scene = new Scene();
using var sceneScope = scene.Push();
var go = scene.CreateObject();
Assert.AreEqual( GameObjectFlags.None, go.Flags );
go.Flags |= GameObjectFlags.Hidden;
go.Flags |= GameObjectFlags.NotSaved;
Assert.IsTrue( go.Flags.Contains( GameObjectFlags.Hidden ) );
Assert.IsTrue( go.Flags.Contains( GameObjectFlags.NotSaved ) );
go.Flags &= ~GameObjectFlags.Hidden;
Assert.IsFalse( go.Flags.Contains( GameObjectFlags.Hidden ) );
Assert.IsTrue( go.Flags.Contains( GameObjectFlags.NotSaved ), "removing one flag must not clear others" );
}
///
/// IsDeserializing directly reflects the Deserializing flag bit.
///
[TestMethod]
public void IsDeserializingReflectsFlag()
{
var scene = new Scene();
using var sceneScope = scene.Push();
var go = scene.CreateObject();
Assert.IsFalse( go.IsDeserializing );
go.Flags |= GameObjectFlags.Deserializing;
Assert.IsTrue( go.IsDeserializing );
go.Flags &= ~GameObjectFlags.Deserializing;
Assert.IsFalse( go.IsDeserializing );
}
///
/// HasFlagOrParent finds a flag set anywhere up the ancestor chain, on self,
/// the parent or a grandparent - and returns false when nobody has it.
///
[TestMethod]
public void HasFlagOrParentWalksAncestors()
{
var scene = new Scene();
using var sceneScope = scene.Push();
var grandparent = scene.CreateObject();
var parent = new GameObject( grandparent );
var child = new GameObject( parent );
Assert.IsFalse( child.HasFlagOrParent( GameObjectFlags.Hidden ) );
grandparent.Flags |= GameObjectFlags.Hidden;
Assert.IsTrue( child.HasFlagOrParent( GameObjectFlags.Hidden ) );
Assert.IsTrue( parent.HasFlagOrParent( GameObjectFlags.Hidden ) );
Assert.IsTrue( grandparent.HasFlagOrParent( GameObjectFlags.Hidden ), "the object's own flags count too" );
child.Flags |= GameObjectFlags.Loading;
Assert.IsTrue( child.HasFlagOrParent( GameObjectFlags.Loading ) );
Assert.IsFalse( grandparent.HasFlagOrParent( GameObjectFlags.Loading ), "flags must not leak from children to parents" );
}
}