using System; using System.IO; using System.Xml; using System.Xml.Serialization; namespace SabreTools.Skippers.Tests { /// /// Test that tests file size /// [XmlType("file")] public class FileTest : Test { #region Fields /// /// Determines whether a pass or failure is expected /// [XmlAttribute("result")] public bool Result { get; set; } = true; /// /// Expected size of the input byte array, used with the Operator /// /// Either numeric or the literal "po2" [XmlAttribute("size")] public string Size { get => _size == null ? "po2" : _size.Value.ToString(); set { if (value == null || value.ToLowerInvariant() == "po2") _size = null; else _size = Convert.ToInt64(value, fromBase: 16); } } /// /// Expected range value for the input byte array size, used with Size /// [XmlAttribute("operator")] public HeaderSkipTestFileOperator Operator { get; set; } #endregion #region Private instance variables /// /// File offset to run the test /// /// null is PO2 ("power of 2" filesize) private long? _size; #endregion /// public override bool Passes(Stream input) { // First get the file size from stream long size = input.Length; // If we have a null size, check that the size is a power of 2 bool result = true; if (_size == null) { // http://stackoverflow.com/questions/600293/how-to-check-if-a-number-is-a-power-of-2 result = (((ulong)size & ((ulong)size - 1)) == 0); } else if (Operator == HeaderSkipTestFileOperator.Less) { result = (size < _size); } else if (Operator == HeaderSkipTestFileOperator.Greater) { result = (size > _size); } else if (Operator == HeaderSkipTestFileOperator.Equal) { result = (size == _size); } // Return if the expected and actual results match return result == Result; } } }