| package tfdiags |
| |
| import ( |
| "fmt" |
| "testing" |
| |
| "github.com/google/go-cmp/cmp" |
| "github.com/google/go-cmp/cmp/cmpopts" |
| "github.com/hashicorp/hcl/v2" |
| "github.com/zclconf/go-cty/cty" |
| ) |
| |
| func TestDiagnosticsToHCL(t *testing.T) { |
| var diags Diagnostics |
| diags = diags.Append(Sourceless( |
| Error, |
| "A sourceless diagnostic", |
| "...that has a detail", |
| )) |
| diags = diags.Append(fmt.Errorf("a diagnostic promoted from an error")) |
| diags = diags.Append(SimpleWarning("A diagnostic from a simple warning")) |
| diags = diags.Append(&hcl.Diagnostic{ |
| Severity: hcl.DiagWarning, |
| Summary: "A diagnostic from HCL", |
| Detail: "...that has a detail and source information", |
| Subject: &hcl.Range{ |
| Filename: "test.tf", |
| Start: hcl.Pos{Line: 1, Column: 2, Byte: 1}, |
| End: hcl.Pos{Line: 1, Column: 3, Byte: 2}, |
| }, |
| Context: &hcl.Range{ |
| Filename: "test.tf", |
| Start: hcl.Pos{Line: 1, Column: 1, Byte: 0}, |
| End: hcl.Pos{Line: 1, Column: 4, Byte: 3}, |
| }, |
| EvalContext: &hcl.EvalContext{}, |
| Expression: &fakeHCLExpression{}, |
| }) |
| |
| got := diags.ToHCL() |
| want := hcl.Diagnostics{ |
| { |
| Severity: hcl.DiagError, |
| Summary: "A sourceless diagnostic", |
| Detail: "...that has a detail", |
| }, |
| { |
| Severity: hcl.DiagError, |
| Summary: "a diagnostic promoted from an error", |
| }, |
| { |
| Severity: hcl.DiagWarning, |
| Summary: "A diagnostic from a simple warning", |
| }, |
| { |
| Severity: hcl.DiagWarning, |
| Summary: "A diagnostic from HCL", |
| Detail: "...that has a detail and source information", |
| Subject: &hcl.Range{ |
| Filename: "test.tf", |
| Start: hcl.Pos{Line: 1, Column: 2, Byte: 1}, |
| End: hcl.Pos{Line: 1, Column: 3, Byte: 2}, |
| }, |
| Context: &hcl.Range{ |
| Filename: "test.tf", |
| Start: hcl.Pos{Line: 1, Column: 1, Byte: 0}, |
| End: hcl.Pos{Line: 1, Column: 4, Byte: 3}, |
| }, |
| EvalContext: &hcl.EvalContext{}, |
| Expression: &fakeHCLExpression{}, |
| }, |
| } |
| |
| if diff := cmp.Diff(want, got, cmpopts.IgnoreUnexported(hcl.EvalContext{})); diff != "" { |
| t.Errorf("incorrect result\n%s", diff) |
| } |
| } |
| |
| // We have this here just to give us something easy to compare in the test |
| // above, because we only care that the expression passes through, not about |
| // how exactly it is shaped. |
| type fakeHCLExpression struct { |
| } |
| |
| func (e *fakeHCLExpression) Range() hcl.Range { |
| return hcl.Range{} |
| } |
| |
| func (e *fakeHCLExpression) StartRange() hcl.Range { |
| return hcl.Range{} |
| } |
| |
| func (e *fakeHCLExpression) Variables() []hcl.Traversal { |
| return nil |
| } |
| |
| func (e *fakeHCLExpression) Value(ctx *hcl.EvalContext) (cty.Value, hcl.Diagnostics) { |
| return cty.DynamicVal, nil |
| } |