Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(191)

Unified Diff: mojom/mojom_parser/parser/computed_data_test.go

Issue 1805743003: Mojom frontend: Compute, validate and populate struct field version info (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: Rename ComputeDataForGenerators to ComputeFinalData Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « mojom/mojom_parser/mojom/user_defined_types_test.go ('k') | mojom/mojom_parser/parser/parse_driver.go » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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)
+ }
+ }
+
+ }
+}
« no previous file with comments | « mojom/mojom_parser/mojom/user_defined_types_test.go ('k') | mojom/mojom_parser/parser/parse_driver.go » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698