diff --git a/src/AnthropicClient/Models/CharacterLocationCitation.cs b/src/AnthropicClient/Models/CharacterLocationCitation.cs
index 0b461cb..678326e 100644
--- a/src/AnthropicClient/Models/CharacterLocationCitation.cs
+++ b/src/AnthropicClient/Models/CharacterLocationCitation.cs
@@ -18,4 +18,12 @@ public class CharacterLocationCitation : Citation
///
[JsonPropertyName("end_char_index")]
public int EndCharIndex { get; init; }
+
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ /// A new instance of .
+ public CharacterLocationCitation() : base(CitationType.CharacterLocation)
+ {
+ }
}
diff --git a/src/AnthropicClient/Models/Citation.cs b/src/AnthropicClient/Models/Citation.cs
index ec7ae73..485f917 100644
--- a/src/AnthropicClient/Models/Citation.cs
+++ b/src/AnthropicClient/Models/Citation.cs
@@ -29,4 +29,19 @@ public abstract class Citation
///
[JsonPropertyName("document_title")]
public string DocumentTitle { get; init; } = string.Empty;
+
+ [JsonConstructor]
+ internal Citation()
+ {
+ }
+
+ ///
+ /// Initializes a new instance of the class with a specified type.
+ ///
+ /// The type of the citation.
+ /// A new instance of .
+ protected Citation(string type)
+ {
+ Type = type;
+ }
}
diff --git a/src/AnthropicClient/Models/CitationDelta.cs b/src/AnthropicClient/Models/CitationDelta.cs
index 1d27bd0..e299d97 100644
--- a/src/AnthropicClient/Models/CitationDelta.cs
+++ b/src/AnthropicClient/Models/CitationDelta.cs
@@ -22,6 +22,9 @@ public class CitationDelta : ContentDelta
///
/// Initializes a new instance of the class.
///
+ /// The citation to associate with this delta.
+ /// Thrown when is null.
+ /// A new instance of .
public CitationDelta(Citation citation) : base(ContentDeltaType.CitationDelta)
{
ArgumentValidator.ThrowIfNull(citation, nameof(citation));
diff --git a/src/AnthropicClient/Models/ContentBlockLocationCitation.cs b/src/AnthropicClient/Models/ContentBlockLocationCitation.cs
index 0cbb73a..f0383bb 100644
--- a/src/AnthropicClient/Models/ContentBlockLocationCitation.cs
+++ b/src/AnthropicClient/Models/ContentBlockLocationCitation.cs
@@ -18,4 +18,12 @@ public class ContentBlockLocationCitation : Citation
///
[JsonPropertyName("end_block_index")]
public int EndBlockIndex { get; init; }
+
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ /// A new instance of .
+ public ContentBlockLocationCitation() : base(CitationType.ContentBlockLocation)
+ {
+ }
}
\ No newline at end of file
diff --git a/src/AnthropicClient/Models/PageLocationCitation.cs b/src/AnthropicClient/Models/PageLocationCitation.cs
index 040c262..29a9ce1 100644
--- a/src/AnthropicClient/Models/PageLocationCitation.cs
+++ b/src/AnthropicClient/Models/PageLocationCitation.cs
@@ -18,4 +18,12 @@ public class PageLocationCitation : Citation
///
[JsonPropertyName("end_page_number")]
public int EndPageNumber { get; init; }
+
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ /// A new instance of .
+ public PageLocationCitation() : base(CitationType.PageLocation)
+ {
+ }
}
diff --git a/tests/AnthropicClient.Tests/Unit/Models/Base64SourceTests.cs b/tests/AnthropicClient.Tests/Unit/Models/Base64SourceTests.cs
new file mode 100644
index 0000000..1a6972b
--- /dev/null
+++ b/tests/AnthropicClient.Tests/Unit/Models/Base64SourceTests.cs
@@ -0,0 +1,39 @@
+namespace AnthropicClient.Tests.Unit.Models;
+
+public class Base64SourceTests
+{
+ [Fact]
+ public void Constructor_WhenCalledWithValidArguments_ItShouldSetProperties()
+ {
+ var mediaType = "application/pdf";
+ var data = "base64data";
+
+ var source = new Base64Source(mediaType, data);
+
+ source.MediaType.Should().Be(mediaType);
+ source.Data.Should().Be(data);
+ source.Type.Should().Be("base64");
+ }
+
+ [Fact]
+ public void Constructor_WhenCalledWithNullMediaType_ItShouldThrowArgumentNullException()
+ {
+ string? mediaType = null;
+ var data = "base64data";
+
+ var action = () => new Base64Source(mediaType!, data);
+
+ action.Should().Throw();
+ }
+
+ [Fact]
+ public void Constructor_WhenCalledWithNullData_ItShouldThrowArgumentNullException()
+ {
+ var mediaType = "application/pdf";
+ string? data = null;
+
+ var action = () => new Base64Source(mediaType, data!);
+
+ action.Should().Throw();
+ }
+}
\ No newline at end of file
diff --git a/tests/AnthropicClient.Tests/Unit/Models/CharacterLocationCitationTests.cs b/tests/AnthropicClient.Tests/Unit/Models/CharacterLocationCitationTests.cs
new file mode 100644
index 0000000..0043ea4
--- /dev/null
+++ b/tests/AnthropicClient.Tests/Unit/Models/CharacterLocationCitationTests.cs
@@ -0,0 +1,17 @@
+namespace AnthropicClient.Tests.Unit.Models;
+
+public class CharacterLocationCitationTests
+{
+ [Fact]
+ public void Constructor_WhenCalled_ItShouldSetProperties()
+ {
+ var result = new CharacterLocationCitation();
+
+ result.Type.Should().Be("char_location");
+ result.CitedText.Should().BeEmpty();
+ result.DocumentIndex.Should().Be(0);
+ result.DocumentTitle.Should().BeEmpty();
+ result.StartCharIndex.Should().Be(0);
+ result.EndCharIndex.Should().Be(0);
+ }
+}
\ No newline at end of file
diff --git a/tests/AnthropicClient.Tests/Unit/Models/CitationDeltaTests.cs b/tests/AnthropicClient.Tests/Unit/Models/CitationDeltaTests.cs
new file mode 100644
index 0000000..8352ce8
--- /dev/null
+++ b/tests/AnthropicClient.Tests/Unit/Models/CitationDeltaTests.cs
@@ -0,0 +1,31 @@
+namespace AnthropicClient.Tests.Unit.Models;
+
+public class CitationDeltaTests
+{
+ [Fact]
+ public void Constructor_WhenCalled_ItShouldSetProperties()
+ {
+ var result = new CitationDelta();
+
+ result.Type.Should().Be("citations_delta");
+ result.Citation.Should().BeEquivalentTo(new CharacterLocationCitation());
+ }
+
+ [Fact]
+ public void Constructor_WhenCalledWithCitation_ItShouldSetProperties()
+ {
+ var citation = new ContentBlockLocationCitation();
+ var result = new CitationDelta(citation);
+
+ result.Type.Should().Be("citations_delta");
+ result.Citation.Should().BeSameAs(citation);
+ }
+
+ [Fact]
+ public void Constructor_WhenCalledWithNullCitation_ItShouldThrowException()
+ {
+ var act = () => new CitationDelta(null!);
+
+ act.Should().Throw();
+ }
+}
\ No newline at end of file
diff --git a/tests/AnthropicClient.Tests/Unit/Models/CitationOptionTests.cs b/tests/AnthropicClient.Tests/Unit/Models/CitationOptionTests.cs
new file mode 100644
index 0000000..36ff5d8
--- /dev/null
+++ b/tests/AnthropicClient.Tests/Unit/Models/CitationOptionTests.cs
@@ -0,0 +1,12 @@
+namespace AnthropicClient.Tests.Unit.Models;
+
+public class CitationOptionTests
+{
+ [Fact]
+ public void Constructor_WhenCalled_ItShouldSetProperties()
+ {
+ var result = new CitationOption();
+
+ result.Enabled.Should().BeFalse();
+ }
+}
\ No newline at end of file
diff --git a/tests/AnthropicClient.Tests/Unit/Models/CitationTypeTests.cs b/tests/AnthropicClient.Tests/Unit/Models/CitationTypeTests.cs
new file mode 100644
index 0000000..c0fb416
--- /dev/null
+++ b/tests/AnthropicClient.Tests/Unit/Models/CitationTypeTests.cs
@@ -0,0 +1,22 @@
+namespace AnthropicClient.Tests.Unit.Models;
+
+public class CitationTypeTests
+{
+ [Fact]
+ public void ContentBlockLocation_WhenCalled_ItShouldReturnCorrectValue()
+ {
+ CitationType.ContentBlockLocation.Should().Be("content_block_location");
+ }
+
+ [Fact]
+ public void CharacterLocation_WhenCalled_ItShouldReturnCorrectValue()
+ {
+ CitationType.CharacterLocation.Should().Be("char_location");
+ }
+
+ [Fact]
+ public void PageLocation_WhenCalled_ItShouldReturnCorrectValue()
+ {
+ CitationType.PageLocation.Should().Be("page_location");
+ }
+}
\ No newline at end of file
diff --git a/tests/AnthropicClient.Tests/Unit/Models/ContentBlockLocationCitationTests.cs b/tests/AnthropicClient.Tests/Unit/Models/ContentBlockLocationCitationTests.cs
new file mode 100644
index 0000000..45fc169
--- /dev/null
+++ b/tests/AnthropicClient.Tests/Unit/Models/ContentBlockLocationCitationTests.cs
@@ -0,0 +1,17 @@
+namespace AnthropicClient.Tests.Unit.Models;
+
+public class ContentBlockLocationCitationTests
+{
+ [Fact]
+ public void Constructor_WhenCalled_ItShouldSetProperties()
+ {
+ var result = new ContentBlockLocationCitation();
+
+ result.Type.Should().Be("content_block_location");
+ result.CitedText.Should().BeEmpty();
+ result.DocumentIndex.Should().Be(0);
+ result.DocumentTitle.Should().BeEmpty();
+ result.StartBlockIndex.Should().Be(0);
+ result.EndBlockIndex.Should().Be(0);
+ }
+}
\ No newline at end of file
diff --git a/tests/AnthropicClient.Tests/Unit/Models/ContentDeltaTypeTests.cs b/tests/AnthropicClient.Tests/Unit/Models/ContentDeltaTypeTests.cs
index 32a0023..bb46b42 100644
--- a/tests/AnthropicClient.Tests/Unit/Models/ContentDeltaTypeTests.cs
+++ b/tests/AnthropicClient.Tests/Unit/Models/ContentDeltaTypeTests.cs
@@ -21,4 +21,14 @@ public class ContentDeltaTypeTests
actual.Should().Be(expected);
}
+
+ [Fact]
+ public void CitationDelta_WhenCalled_ItShouldReturnExpectedValue()
+ {
+ var expected = "citations_delta";
+
+ var actual = ContentDeltaType.CitationDelta;
+
+ actual.Should().Be(expected);
+ }
}
\ No newline at end of file