Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 19 additions & 0 deletions .editorconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
root = true

[*]
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true

[*.cs]
indent_style = space
indent_size = 4

[*.{csproj,sln}]
indent_style = space
indent_size = 2

[*.{json,yaml,yml}]
indent_style = space
indent_size = 2
64 changes: 64 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
# Normalize all text files to LF in the repository.
# This eliminates CRLF drift on Windows (core.autocrlf=true) so that
# `npm run generate` never produces spurious line-ending diffs.

# Default: auto-detect text files and normalize to LF on checkout.
* text=auto eol=lf

# --- Source code ---
*.py text eol=lf
*.ts text eol=lf
*.tsx text eol=lf
*.js text eol=lf
*.mjs text eol=lf
*.rs text eol=lf
*.go text eol=lf
*.cs text eol=lf
*.tsp text eol=lf
*.astro text eol=lf
*.css text eol=lf
*.html text eol=lf

# --- Config / data ---
*.json text eol=lf
*.yaml text eol=lf
*.yml text eol=lf
*.toml text eol=lf
*.md text eol=lf
*.mdx text eol=lf
*.txt text eol=lf
*.prompty text eol=lf
*.cfg text eol=lf
*.conf text eol=lf
*.mod text eol=lf
*.sum text eol=lf

# --- Project files ---
*.csproj text eol=lf
*.sln text eol=lf
*.ps1 text eol=lf
*.bat text eol=lf

# --- Dotfiles (no extension — treat as text) ---
.gitignore text eol=lf
.gitattributes text eol=lf
.dockerignore text eol=lf
.vscodeignore text eol=lf
.babelrc text eol=lf
.example text eol=lf
Dockerfile text eol=lf

# --- Truly binary files --- keep as-is
*.png binary
*.exe binary
*.svg text eol=lf

# --- Lock files: text but don't diff ---
*.lock text eol=lf -diff
package-lock.json text eol=lf -diff
Cargo.lock text eol=lf -diff

# --- Generated marker (no content) ---
*.typed text eol=lf
*.tsbuildinfo text eol=lf
*.tracy text eol=lf
Original file line number Diff line number Diff line change
@@ -0,0 +1,122 @@
using Xunit;

#pragma warning disable IDE0130
namespace Prompty.Core;
#pragma warning restore IDE0130


public class FileNotFoundErrorConversionTests
{
[Fact]
public void LoadYamlInput()
{
string yamlData = """
message: "Prompty file not found: ./chat.prompty"
path: ./chat.prompty

""";

var instance = FileNotFoundError.FromYaml(yamlData);

Assert.NotNull(instance);
Assert.Equal("Prompty file not found: ./chat.prompty", instance.Message);
Assert.Equal("./chat.prompty", instance.Path);
}

[Fact]
public void LoadJsonInput()
{
string jsonData = """
{
"message": "Prompty file not found: ./chat.prompty",
"path": "./chat.prompty"
}
""";

var instance = FileNotFoundError.FromJson(jsonData);
Assert.NotNull(instance);
Assert.Equal("Prompty file not found: ./chat.prompty", instance.Message);
Assert.Equal("./chat.prompty", instance.Path);
}

[Fact]
public void RoundtripJson()
{
// Test that FromJson -> ToJson -> FromJson produces equivalent data
string jsonData = """
{
"message": "Prompty file not found: ./chat.prompty",
"path": "./chat.prompty"
}
""";

var original = FileNotFoundError.FromJson(jsonData);
Assert.NotNull(original);

var json = original.ToJson();
Assert.False(string.IsNullOrEmpty(json));

var reloaded = FileNotFoundError.FromJson(json);
Assert.NotNull(reloaded);
Assert.Equal("Prompty file not found: ./chat.prompty", reloaded.Message);
Assert.Equal("./chat.prompty", reloaded.Path);
}

[Fact]
public void RoundtripYaml()
{
// Test that FromYaml -> ToYaml -> FromYaml produces equivalent data
string yamlData = """
message: "Prompty file not found: ./chat.prompty"
path: ./chat.prompty

""";

var original = FileNotFoundError.FromYaml(yamlData);
Assert.NotNull(original);

var yaml = original.ToYaml();
Assert.False(string.IsNullOrEmpty(yaml));

var reloaded = FileNotFoundError.FromYaml(yaml);
Assert.NotNull(reloaded);
Assert.Equal("Prompty file not found: ./chat.prompty", reloaded.Message);
Assert.Equal("./chat.prompty", reloaded.Path);
}

[Fact]
public void ToJsonProducesValidJson()
{
string jsonData = """
{
"message": "Prompty file not found: ./chat.prompty",
"path": "./chat.prompty"
}
""";

var instance = FileNotFoundError.FromJson(jsonData);
var json = instance.ToJson();

// Verify it's valid JSON by parsing it
var parsed = System.Text.Json.JsonDocument.Parse(json);
Assert.NotNull(parsed);
}

[Fact]
public void ToYamlProducesValidYaml()
{
string yamlData = """
message: "Prompty file not found: ./chat.prompty"
path: ./chat.prompty

""";

var instance = FileNotFoundError.FromYaml(yamlData);
var yaml = instance.ToYaml();

// Verify it's valid YAML by parsing it
var deserializer = new YamlDotNet.Serialization.DeserializerBuilder().Build();
var parsed = deserializer.Deserialize<object>(yaml);
Assert.NotNull(parsed);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,132 @@
using Xunit;

#pragma warning disable IDE0130
namespace Prompty.Core;
#pragma warning restore IDE0130


public class InvokerErrorConversionTests
{
[Fact]
public void LoadYamlInput()
{
string yamlData = """
message: "No renderer registered for key: jinja2"
component: renderer
key: jinja2

""";

var instance = InvokerError.FromYaml(yamlData);

Assert.NotNull(instance);
Assert.Equal("No renderer registered for key: jinja2", instance.Message);
Assert.Equal("renderer", instance.Component);
Assert.Equal("jinja2", instance.Key);
}

[Fact]
public void LoadJsonInput()
{
string jsonData = """
{
"message": "No renderer registered for key: jinja2",
"component": "renderer",
"key": "jinja2"
}
""";

var instance = InvokerError.FromJson(jsonData);
Assert.NotNull(instance);
Assert.Equal("No renderer registered for key: jinja2", instance.Message);
Assert.Equal("renderer", instance.Component);
Assert.Equal("jinja2", instance.Key);
}

[Fact]
public void RoundtripJson()
{
// Test that FromJson -> ToJson -> FromJson produces equivalent data
string jsonData = """
{
"message": "No renderer registered for key: jinja2",
"component": "renderer",
"key": "jinja2"
}
""";

var original = InvokerError.FromJson(jsonData);
Assert.NotNull(original);

var json = original.ToJson();
Assert.False(string.IsNullOrEmpty(json));

var reloaded = InvokerError.FromJson(json);
Assert.NotNull(reloaded);
Assert.Equal("No renderer registered for key: jinja2", reloaded.Message);
Assert.Equal("renderer", reloaded.Component);
Assert.Equal("jinja2", reloaded.Key);
}

[Fact]
public void RoundtripYaml()
{
// Test that FromYaml -> ToYaml -> FromYaml produces equivalent data
string yamlData = """
message: "No renderer registered for key: jinja2"
component: renderer
key: jinja2

""";

var original = InvokerError.FromYaml(yamlData);
Assert.NotNull(original);

var yaml = original.ToYaml();
Assert.False(string.IsNullOrEmpty(yaml));

var reloaded = InvokerError.FromYaml(yaml);
Assert.NotNull(reloaded);
Assert.Equal("No renderer registered for key: jinja2", reloaded.Message);
Assert.Equal("renderer", reloaded.Component);
Assert.Equal("jinja2", reloaded.Key);
}

[Fact]
public void ToJsonProducesValidJson()
{
string jsonData = """
{
"message": "No renderer registered for key: jinja2",
"component": "renderer",
"key": "jinja2"
}
""";

var instance = InvokerError.FromJson(jsonData);
var json = instance.ToJson();

// Verify it's valid JSON by parsing it
var parsed = System.Text.Json.JsonDocument.Parse(json);
Assert.NotNull(parsed);
}

[Fact]
public void ToYamlProducesValidYaml()
{
string yamlData = """
message: "No renderer registered for key: jinja2"
component: renderer
key: jinja2

""";

var instance = InvokerError.FromYaml(yamlData);
var yaml = instance.ToYaml();

// Verify it's valid YAML by parsing it
var deserializer = new YamlDotNet.Serialization.DeserializerBuilder().Build();
var parsed = deserializer.Deserialize<object>(yaml);
Assert.NotNull(parsed);
}
}
Loading
Loading