fixing positional array validation. fixes #113
diff --git a/errors.go b/errors.go
index 5146cbb..9ef4d4c 100644
--- a/errors.go
+++ b/errors.go
@@ -56,6 +56,11 @@
 		ResultErrorFields
 	}
 
+	// ArrayNotEnoughItemsError. ErrorDetails: -
+	ArrayNotEnoughItemsError struct {
+		ResultErrorFields
+	}
+
 	// ArrayMinItemsError. ErrorDetails: min
 	ArrayMinItemsError struct {
 		ResultErrorFields
@@ -172,6 +177,9 @@
 	case *ArrayNoAdditionalItemsError:
 		t = "array_no_additional_items"
 		d = locale.ArrayNoAdditionalItems()
+	case *ArrayNotEnoughItemsError:
+		t = "array_not_enough_items"
+		d = locale.ArrayNotEnoughItems()
 	case *ArrayMinItemsError:
 		t = "array_min_items"
 		d = locale.ArrayMinItems()
diff --git a/json_schema_test_suite/items/data_20.json b/json_schema_test_suite/items/data_20.json
new file mode 100644
index 0000000..0ede6e1
--- /dev/null
+++ b/json_schema_test_suite/items/data_20.json
@@ -0,0 +1 @@
+["foo",1]
diff --git a/json_schema_test_suite/items/schema_2.json b/json_schema_test_suite/items/schema_2.json
new file mode 100644
index 0000000..5345d5f
--- /dev/null
+++ b/json_schema_test_suite/items/schema_2.json
@@ -0,0 +1 @@
+{"items":[{"type":"integer"},{"type":"string"},{"type":"string"}], "additionalItems": false}
diff --git a/locales.go b/locales.go
index de05d60..ae42ae7 100644
--- a/locales.go
+++ b/locales.go
@@ -37,6 +37,7 @@
 		MissingDependency() string
 		Internal() string
 		Enum() string
+		ArrayNotEnoughItems() string
 		ArrayNoAdditionalItems() string
 		ArrayMinItems() string
 		ArrayMaxItems() string
@@ -122,6 +123,10 @@
 	return `No additional items allowed on array`
 }
 
+func (l DefaultLocale) ArrayNotEnoughItems() string {
+	return `Not enough items on array to match positional list of schema`
+}
+
 func (l DefaultLocale) ArrayMinItems() string {
 	return `Array must have at least %min% items`
 }
diff --git a/schema_test.go b/schema_test.go
index 5306ea1..c2c025a 100644
--- a/schema_test.go
+++ b/schema_test.go
@@ -248,6 +248,7 @@
 		{"phase": "a schema given for items", "test": "ignores non-arrays", "schema": "items/schema_0.json", "data": "items/data_02.json", "valid": "true"},
 		{"phase": "an array of schemas for items", "test": "correct types", "schema": "items/schema_1.json", "data": "items/data_10.json", "valid": "true"},
 		{"phase": "an array of schemas for items", "test": "wrong types", "schema": "items/schema_1.json", "data": "items/data_11.json", "valid": "false", "errors": "invalid_type, invalid_type"},
+		{"phase": "an array of schemas for items", "test": "too many with wrong types", "schema": "items/schema_2.json", "data": "items/data_20.json", "valid": "false", "errors": "array_not_enough_items, invalid_type, invalid_type"},
 		{"phase": "valid definition", "test": "valid definition schema", "schema": "definitions/schema_0.json", "data": "definitions/data_00.json", "valid": "true"},
 		{"phase": "invalid definition", "test": "invalid definition schema", "schema": "definitions/schema_1.json", "data": "definitions/data_10.json", "valid": "false", "errors": "number_any_of, enum"},
 		{"phase": "additionalItems as schema", "test": "additional items match schema", "schema": "additionalItems/schema_0.json", "data": "additionalItems/data_00.json", "valid": "true"},
diff --git a/validation.go b/validation.go
index 60d637e..920c17b 100644
--- a/validation.go
+++ b/validation.go
@@ -412,7 +412,7 @@
 		internalLog(" %v", value)
 	}
 
-	nbItems := len(value)
+	nbValues := len(value)
 
 	// TODO explain
 	if currentSubSchema.itemsChildrenIsSingleSchema {
@@ -425,15 +425,26 @@
 		if currentSubSchema.itemsChildren != nil && len(currentSubSchema.itemsChildren) > 0 {
 
 			nbItems := len(currentSubSchema.itemsChildren)
-			nbValues := len(value)
 
-			if nbItems == nbValues {
-				for i := 0; i != nbItems; i++ {
+			if nbItems > nbValues {
+				// we have more positional schemas than we do items
+				result.addError(new(ArrayNotEnoughItemsError), context, value, ErrorDetails{})
+			}
+
+			if nbItems >= nbValues {
+				// we have enough schemas to cover all our values, but use >=
+				// so if we have too many schemas, we are covered by the above error
+				// but we continue reporting if any of the items we already have don't
+				// match their corresponding schema.
+				for i := 0; i != nbItems && i != nbValues; i++ {
 					subContext := newJsonContext(strconv.Itoa(i), context)
 					validationResult := currentSubSchema.itemsChildren[i].subValidateWithContext(value[i], subContext)
 					result.mergeErrors(validationResult)
 				}
 			} else if nbItems < nbValues {
+				// we have less schemas than elements in the instance array,
+				// but that might be ok if "additionalItems" is specified.
+
 				switch currentSubSchema.additionalItems.(type) {
 				case bool:
 					if !currentSubSchema.additionalItems.(bool) {
@@ -453,7 +464,7 @@
 
 	// minItems & maxItems
 	if currentSubSchema.minItems != nil {
-		if nbItems < int(*currentSubSchema.minItems) {
+		if nbValues < int(*currentSubSchema.minItems) {
 			result.addError(
 				new(ArrayMinItemsError),
 				context,
@@ -463,7 +474,7 @@
 		}
 	}
 	if currentSubSchema.maxItems != nil {
-		if nbItems > int(*currentSubSchema.maxItems) {
+		if nbValues > int(*currentSubSchema.maxItems) {
 			result.addError(
 				new(ArrayMaxItemsError),
 				context,