From d7c3f4a5992bfaa0a909fb5163eda974e29e7c26 Mon Sep 17 00:00:00 2001 From: darthsharp <48331467+darthsharp@users.noreply.github.com> Date: Sat, 25 Apr 2026 17:10:06 +0200 Subject: [PATCH] Add support for compile-time options in Homebrew formulas - Introduced `BrewFormulaOptionModel` to represent individual formula options. - Updated `BrewFormulaModel` to use `BrewFormulaOptionModel[]` for options. - Added unit tests for deserialization of `BrewFormulaOptionModel`. --- .../Models/Formulae/BrewFormulaModel.cs | 2 +- .../Models/Formulae/BrewFormulaOptionModel.cs | 19 +++++++ .../Formulae/BrewFormulaOptionModelTests.cs | 56 +++++++++++++++++++ 3 files changed, 76 insertions(+), 1 deletion(-) create mode 100644 source/CreativeCoders.MacOS.HomeBrew/Models/Formulae/BrewFormulaOptionModel.cs create mode 100644 tests/CreativeCoders.MacOS.HomeBrew.Tests/Models/Formulae/BrewFormulaOptionModelTests.cs diff --git a/source/CreativeCoders.MacOS.HomeBrew/Models/Formulae/BrewFormulaModel.cs b/source/CreativeCoders.MacOS.HomeBrew/Models/Formulae/BrewFormulaModel.cs index bb3eea6..1119e5c 100644 --- a/source/CreativeCoders.MacOS.HomeBrew/Models/Formulae/BrewFormulaModel.cs +++ b/source/CreativeCoders.MacOS.HomeBrew/Models/Formulae/BrewFormulaModel.cs @@ -97,7 +97,7 @@ public class BrewFormulaModel /// Gets or sets compile-time options (rarely used). [JsonPropertyName("options")] - public string[]? Options { get; set; } + public BrewFormulaOptionModel[]? Options { get; set; } /// Gets or sets build-time dependencies. [JsonPropertyName("build_dependencies")] diff --git a/source/CreativeCoders.MacOS.HomeBrew/Models/Formulae/BrewFormulaOptionModel.cs b/source/CreativeCoders.MacOS.HomeBrew/Models/Formulae/BrewFormulaOptionModel.cs new file mode 100644 index 0000000..f14f014 --- /dev/null +++ b/source/CreativeCoders.MacOS.HomeBrew/Models/Formulae/BrewFormulaOptionModel.cs @@ -0,0 +1,19 @@ +using System.Text.Json.Serialization; +using JetBrains.Annotations; + +namespace CreativeCoders.MacOS.HomeBrew.Models.Formulae; + +/// +/// Represents a compile-time option for a Homebrew formula. +/// +[UsedImplicitly] +public class BrewFormulaOptionModel +{ + /// Gets or sets the option flag (e.g. --without-mono). + [JsonPropertyName("option")] + public string? Option { get; set; } + + /// Gets or sets the human-readable description of the option. + [JsonPropertyName("description")] + public string? Description { get; set; } +} diff --git a/tests/CreativeCoders.MacOS.HomeBrew.Tests/Models/Formulae/BrewFormulaOptionModelTests.cs b/tests/CreativeCoders.MacOS.HomeBrew.Tests/Models/Formulae/BrewFormulaOptionModelTests.cs new file mode 100644 index 0000000..fcc19aa --- /dev/null +++ b/tests/CreativeCoders.MacOS.HomeBrew.Tests/Models/Formulae/BrewFormulaOptionModelTests.cs @@ -0,0 +1,56 @@ +using System.Text.Json; +using AwesomeAssertions; +using CreativeCoders.MacOS.HomeBrew.Models.Formulae; + +namespace CreativeCoders.MacOS.HomeBrew.Tests.Models.Formulae; + +public class BrewFormulaOptionModelTests +{ + [Fact] + public void Deserialize_WhenOptionsContainObjects_ReturnsModelsWithProperties() + { + const string json = """ + { + "options": [ + {"option": "--without-mono", "description": "Build without mono support"} + ] + } + """; + + var result = JsonSerializer.Deserialize(json); + + result!.Options.Should().HaveCount(1); + result.Options![0].Option.Should().Be("--without-mono"); + result.Options[0].Description.Should().Be("Build without mono support"); + } + + [Fact] + public void Deserialize_WhenOptionsIsEmptyArray_ReturnsEmptyArray() + { + const string json = """{"options": []}"""; + + var result = JsonSerializer.Deserialize(json); + + result!.Options.Should().BeEmpty(); + } + + [Fact] + public void Deserialize_WhenOptionsIsNull_ReturnsNull() + { + const string json = """{"options": null}"""; + + var result = JsonSerializer.Deserialize(json); + + result!.Options.Should().BeNull(); + } + + [Fact] + public void Deserialize_WhenOptionsIsMissing_ReturnsNull() + { + const string json = """{}"""; + + var result = JsonSerializer.Deserialize(json); + + result!.Options.Should().BeNull(); + } +}