| Index: mojom/mojom_parser/parser/computed_data_test.go
|
| diff --git a/mojom/mojom_parser/parser/computed_data_test.go b/mojom/mojom_parser/parser/computed_data_test.go
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..012e39aea4ac6fa2ea48c523116d68c1e44a80bd
|
| --- /dev/null
|
| +++ b/mojom/mojom_parser/parser/computed_data_test.go
|
| @@ -0,0 +1,200 @@
|
| +// Copyright 2015 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +package parser
|
| +
|
| +import (
|
| + "mojom/mojom_parser/mojom"
|
| + "strings"
|
| + "testing"
|
| +)
|
| +
|
| +// TestMinVersionErrors test the method MojomStruct.ComputeVersionInfo() which
|
| +// is invoked by ComputeFinalData. This phase occurs after resolution
|
| +// and type validation. We test that different types of errors related to
|
| +// the MinVersion attribute are correctly detected.
|
| +func TestMinVersionErrors(t *testing.T) {
|
| + test := singleFileTest{}
|
| +
|
| + ////////////////////////////////////////////////////////////
|
| + // Test Case: Float value for MinVersion
|
| + ////////////////////////////////////////////////////////////
|
| + {
|
| + contents := `
|
| + struct Foo{
|
| + int32 x;
|
| + int32 y;
|
| +
|
| + [MinVersion = 1.1]
|
| + array<int32>? z;
|
| +
|
| + [MinVersion = 2]
|
| + array<int32>? w;
|
| + };`
|
| + test.addTestCase(contents, []string{
|
| + "Invalid MinVersion attribute for field z: 1.1. ",
|
| + "The value must be a non-negative 32-bit integer value."})
|
| + }
|
| +
|
| + ////////////////////////////////////////////////////////////
|
| + // Test Case: string value for MinVersion
|
| + ////////////////////////////////////////////////////////////
|
| + {
|
| + contents := `
|
| + struct Foo{
|
| + int32 x;
|
| + int32 y;
|
| +
|
| + [MinVersion = "1"]
|
| + array<int32>? z;
|
| +
|
| + [MinVersion = 2]
|
| + array<int32>? w;
|
| + };`
|
| + test.addTestCase(contents, []string{
|
| + "Invalid MinVersion attribute for field z: \"1\". ",
|
| + "The value must be a non-negative 32-bit integer value."})
|
| + }
|
| +
|
| + ////////////////////////////////////////////////////////////
|
| + // Test Case: MinVersion is negative
|
| + ////////////////////////////////////////////////////////////
|
| + {
|
| + contents := `
|
| + struct Foo{
|
| + int32 x;
|
| + int32 y;
|
| +
|
| + [MinVersion = -1]
|
| + array<int32>? z;
|
| +
|
| + [MinVersion = 2]
|
| + array<int32>? w;
|
| + };`
|
| + test.addTestCase(contents, []string{
|
| + "Invalid MinVersion attribute for field z: -1. ",
|
| + "The value must be a non-negative 32-bit integer value."})
|
| + }
|
| +
|
| + ////////////////////////////////////////////////////////////
|
| + // Test Case: MinVersion is to big for 32 bits
|
| + ////////////////////////////////////////////////////////////
|
| + {
|
| + contents := `
|
| + struct Foo{
|
| + int32 x;
|
| + int32 y;
|
| +
|
| + [MinVersion = 1234567890123]
|
| + array<int32>? z;
|
| +
|
| + [MinVersion = 2]
|
| + array<int32>? w;
|
| + };`
|
| + test.addTestCase(contents, []string{
|
| + "Invalid MinVersion attribute for field z: 1234567890123. ",
|
| + "The value must be a non-negative 32-bit integer value."})
|
| + }
|
| +
|
| + ////////////////////////////////////////////////////////////
|
| + // Test Case: Min Versions must be increasing.
|
| + ////////////////////////////////////////////////////////////
|
| + {
|
| + contents := `
|
| + struct Foo{
|
| + int32 x;
|
| + int32 y;
|
| +
|
| + [MinVersion = 2]
|
| + array<int32>? z;
|
| +
|
| + [MinVersion = 1]
|
| + array<int32>? w;
|
| + };`
|
| + test.addTestCase(contents, []string{
|
| + "Invalid MinVersion attribute for field w: 1. ",
|
| + "The MinVersion must be non-decreasing as a function of the ordinal.",
|
| + " This field's MinVersion must be at least 2."})
|
| + }
|
| +
|
| + ////////////////////////////////////////////////////////////
|
| + // Test Case: Min Versions must be increasing: ordinals are used.
|
| + ////////////////////////////////////////////////////////////
|
| + {
|
| + contents := `
|
| + struct Foo{
|
| + int32 x;
|
| + int32 y;
|
| +
|
| + [MinVersion = 1]
|
| + array<int32>? z@3;
|
| +
|
| + [MinVersion = 2]
|
| + array<int32>? w@2;
|
| + };`
|
| + test.addTestCase(contents, []string{
|
| + "Invalid MinVersion attribute for field z: 1. ",
|
| + "The MinVersion must be non-decreasing as a function of the ordinal.",
|
| + " This field's MinVersion must be at least 2."})
|
| + }
|
| +
|
| + ////////////////////////////////////////////////////////////
|
| + // Test Case: Non-nullable type used.
|
| + ////////////////////////////////////////////////////////////
|
| + {
|
| + contents := `
|
| + struct Foo{
|
| + int32 x;
|
| + int32 y;
|
| +
|
| + [MinVersion = 1]
|
| + array<int32> z;
|
| +
|
| + [MinVersion = 2]
|
| + array<int32>? w;
|
| + };`
|
| + test.addTestCase(contents, []string{
|
| + "Invalid type for field z: array<int32>.",
|
| + "Non-nullable fields are only allowed in version 0 of of a struct.",
|
| + "This field's MinVersion is 1."})
|
| + }
|
| +
|
| + ////////////////////////////////////////////////////////////
|
| + // Execute all of the test cases.
|
| + ////////////////////////////////////////////////////////////
|
| + for i, c := range test.cases {
|
| + // Parse anresolve the mojom input.
|
| + descriptor := mojom.NewMojomDescriptor()
|
| + specifiedName := ""
|
| + if c.importedFrom == nil {
|
| + specifiedName = c.fileName
|
| + }
|
| + parser := MakeParser(c.fileName, specifiedName, c.mojomContents, descriptor, c.importedFrom)
|
| + parser.Parse()
|
| + if !parser.OK() {
|
| + t.Errorf("Parsing error for %s: %s", c.fileName, parser.GetError().Error())
|
| + continue
|
| + }
|
| + err := descriptor.Resolve()
|
| + if err != nil {
|
| + t.Errorf("Resolution error for %s: %s", c.fileName, err)
|
| + continue
|
| + }
|
| +
|
| + err = descriptor.ComputeFinalData()
|
| +
|
| + if err == nil {
|
| + t.Errorf("Data computation unexpectedly succeeded for test case %d.", i)
|
| + continue
|
| + }
|
| +
|
| + got := err.Error()
|
| + for _, expected := range c.expectedErrors {
|
| + if !strings.Contains(got, expected) {
|
| + t.Errorf("%s:\n*****expected to contain:\n%s\n****actual\n%s", c.fileName, expected, got)
|
| + }
|
| + }
|
| +
|
| + }
|
| +}
|
|
|