Add tests for includeclass errors

master
Oxana 2019-08-14 12:31:10 +03:00
parent 9802dd9f8f
commit 3e728c3899
2 changed files with 254 additions and 0 deletions

View File

@ -0,0 +1,253 @@
(* TEST
* expect
*)
class type foo_t =
object
method foo: string
end
module M: sig
class type ct = object val m: string end
end = struct
class type ct = object end
end
[%%expect{|
class type foo_t = object method foo : string end
Lines 8-10, characters 6-3:
8 | ......struct
9 | class type ct = object end
10 | end
Error: Signature mismatch:
Modules do not match:
sig class type ct = object end end
is not included in
sig class type ct = object val m : string end end
Class type declarations do not match:
class type ct = object end
does not match
class type ct = object val m : string end
The first class type has no instance variable m
|}]
module M: sig
class c : object
method a: string
end
end = struct
class virtual c = object
method virtual a: string
end
end
;;
[%%expect{|
Lines 5-9, characters 6-3:
5 | ......struct
6 | class virtual c = object
7 | method virtual a: string
8 | end
9 | end
Error: Signature mismatch:
Modules do not match:
sig class virtual c : object method virtual a : string end end
is not included in
sig class c : object method a : string end end
Class declarations do not match:
class virtual c : object method virtual a : string end
does not match
class c : object method a : string end
A class cannot be changed from virtual to concrete
|}]
class type ['a] ct = object val x: 'a end
module M: sig
class type ['a] c = object end
end = struct
class type c = object end
end
;;
[%%expect{|
class type ['a] ct = object val x : 'a end
Lines 5-7, characters 6-3:
5 | ......struct
6 | class type c = object end
7 | end
Error: Signature mismatch:
Modules do not match:
sig class type c = object end end
is not included in
sig class type ['a] c = object end end
Class type declarations do not match:
class type c = object end
does not match
class type ['a] c = object end
The classes do not have the same number of type parameters
|}]
module M: sig
class ['a] c: object constraint 'a = int end
end = struct
class ['a] c = object end
end
;;
[%%expect{|
Lines 3-5, characters 6-3:
3 | ......struct
4 | class ['a] c = object end
5 | end
Error: Signature mismatch:
Modules do not match:
sig class ['a] c : object end end
is not included in
sig class ['a] c : object constraint 'a = int end end
Class declarations do not match:
class ['a] c : object end
does not match
class ['a] c : object constraint 'a = int end
A type parameter has type 'a but is expected to have type int
|}]
module M: sig
class c : int -> object end
end = struct
class c (x : float) = object end
end
;;
[%%expect{|
Lines 3-5, characters 6-3:
3 | ......struct
4 | class c (x : float) = object end
5 | end
Error: Signature mismatch:
Modules do not match:
sig class c : float -> object end end
is not included in
sig class c : int -> object end end
Class declarations do not match:
class c : float -> object end
does not match
class c : int -> object end
A parameter has type float but is expected to have type int
|}]
class virtual foo: foo_t =
object
method foo = "foo"
method private virtual cast: int
end
;;
[%%expect{|
Lines 2-5, characters 4-7:
2 | ....object
3 | method foo = "foo"
4 | method private virtual cast: int
5 | end
Error: The class type object method foo : string end
is not matched by the class type foo_t
The virtual method cast cannot be hidden
|}]
class type foo_t2 =
object
method private foo: string
end
class foo: foo_t2 =
object
method foo = "foo"
end
;;
[%%expect{|
class type foo_t2 = object method private foo : string end
Lines 7-9, characters 4-7:
7 | ....object
8 | method foo = "foo"
9 | end
Error: The class type object method foo : string end
is not matched by the class type foo_t2
The public method foo cannot become private
|}]
class virtual foo: foo_t =
object
method virtual foo: string
end
;;
[%%expect{|
Lines 2-4, characters 4-7:
2 | ....object
3 | method virtual foo: string
4 | end
Error: The class type object method virtual foo : string end
is not matched by the class type foo_t
The virtual method foo cannot become concrete
|}]
class type foo_t3 =
object
val mutable x : int
end
class foo: foo_t3 =
object
val x = 1
end
;;
[%%expect{|
class type foo_t3 = object val mutable x : int end
Lines 7-9, characters 4-7:
7 | ....object
8 | val x = 1
9 | end
Error: The class type object val x : int end is not matched by the class type
foo_t3
The non-mutable instance variable x cannot become mutable
|}]
class type foo_t4 =
object
val x : int
end
class virtual foo: foo_t4 =
object
val virtual x : int
end
;;
[%%expect{|
class type foo_t4 = object val x : int end
Lines 7-9, characters 4-7:
7 | ....object
8 | val virtual x : int
9 | end
Error: The class type object val virtual x : int end
is not matched by the class type foo_t4
The virtual instance variable x cannot become concrete
|}]
module M: sig
class type c = object method m: string end
end = struct
class type c = object method private m: string end
end
;;
[%%expect{|
Lines 3-5, characters 6-3:
3 | ......struct
4 | class type c = object method private m: string end
5 | end
Error: Signature mismatch:
Modules do not match:
sig class type c = object method private m : string end end
is not included in
sig class type c = object method m : string end end
Class type declarations do not match:
class type c = object method private m : string end
does not match
class type c = object method m : string end
The private method m cannot become public
|}]

View File

@ -32,3 +32,4 @@ typecore_nolabel_errors.ml
typecore_empty_polyvariant_error.ml
typetexp_errors.ml
external_arity.ml
includeclass_errors.ml