// /***************************************************************************
// Aaru Data Preservation Suite
// ----------------------------------------------------------------------------
//
// Filename       : MacBinary1.cs
// Author(s)      : Natalia Portillo <claunia@claunia.com>
//
// Component      : Aaru unit testing.
//
// --[ License ] --------------------------------------------------------------
//
//     This program is free software: you can redistribute it and/or modify
//     it under the terms of the GNU General Public License as
//     published by the Free Software Foundation, either version 3 of the
//     License, or (at your option) any later version.
//
//     This program is distributed in the hope that it will be useful,
//     but WITHOUT ANY WARRANTY; without even the implied warranty of
//     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//     GNU General Public License for more details.
//
//     You should have received a copy of the GNU General Public License
//     along with this program.  If not, see <http://www.gnu.org/licenses/>.
//
// ----------------------------------------------------------------------------
// Copyright © 2011-2025 Natalia Portillo
// ****************************************************************************/

using System.IO;
using Aaru.Checksums;
using Aaru.CommonTypes.Enums;
using Aaru.CommonTypes.Interfaces;
using Aaru.Filters;
using Aaru.Helpers;
using NUnit.Framework;

namespace Aaru.Tests.Filters;

[TestFixture]
public class MacBinary1
{
    const    string EXPECTED_FILE     = "596c38555bc7ba284648d1ce57700884";
    const    string EXPECTED_CONTENTS = "c2be571406cf6353269faa59a4a8c0a4";
    const    string EXPECTED_RESOURCE = "c689c58945169065483d94e39583d416";
    readonly string _location;

    public MacBinary1() => _location = Path.Combine(Consts.TestFilesRoot, "Filters", "MacBinary", "macbinary1.bin");

    [Test]
    public void CheckContents()
    {
        IFilter filter = new MacBinary();
        filter.Open(_location);
        Stream str  = filter.GetDataForkStream();
        var    data = new byte[737280];
        str.EnsureRead(data, 0, 737280);
        str.Close();
        str.Dispose();
        filter.Close();
        string result = Md5Context.Data(data, out _);
        Assert.That(result, Is.EqualTo(EXPECTED_CONTENTS));
    }

    [Test]
    public void CheckCorrectFile()
    {
        string result = Md5Context.File(_location, out _);
        Assert.That(result, Is.EqualTo(EXPECTED_FILE));
    }

    [Test]
    public void CheckFilterId()
    {
        IFilter filter = new MacBinary();
        Assert.That(filter.Identify(_location), Is.True);
    }

    [Test]
    public void CheckResource()
    {
        IFilter filter = new MacBinary();
        filter.Open(_location);
        Stream str  = filter.GetResourceForkStream();
        var    data = new byte[286];
        str.EnsureRead(data, 0, 286);
        str.Close();
        str.Dispose();
        filter.Close();
        string result = Md5Context.Data(data, out _);
        Assert.That(result, Is.EqualTo(EXPECTED_RESOURCE));
    }

    [Test]
    public void Test()
    {
        IFilter filter = new MacBinary();
        Assert.That(filter.Open(_location),         Is.EqualTo(ErrorNumber.NoError));
        Assert.That(filter.DataForkLength,          Is.EqualTo(737280));
        Assert.That(filter.GetDataForkStream(),     Is.Not.Null);
        Assert.That(filter.ResourceForkLength,      Is.EqualTo(286));
        Assert.That(filter.GetResourceForkStream(), Is.Not.Null);
        Assert.That(filter.HasResourceFork,         Is.True);
        filter.Close();
    }
}