@@ -2,7 +2,7 @@ use async_graphql::{Scalar, ScalarType, Value, InputValueError, InputValueResult
22use postgres_types:: { FromSql , ToSql } ;
33use regex:: Regex ;
44
5- #[ derive( Clone , Debug ) ]
5+ #[ derive( Clone , Debug , PartialEq ) ]
66pub struct YosemiteDecimalGrade {
77 pub grade : u8 ,
88 pub letter : Option < YosemiteDecimalLetter > ,
@@ -62,3 +62,97 @@ impl ScalarType for YosemiteDecimalGrade {
6262 }
6363}
6464
65+ #[ cfg( test) ]
66+ mod tests {
67+ use super :: * ;
68+
69+ #[ test]
70+ fn parse_good ( ) {
71+ let values = [
72+ Value :: String ( "5.9" . into ( ) ) ,
73+ Value :: String ( "5.10a" . into ( ) ) ,
74+ Value :: String ( "5.10b" . into ( ) ) ,
75+ Value :: String ( "5.10c" . into ( ) ) ,
76+ Value :: String ( "5.10d" . into ( ) ) ,
77+ Value :: String ( "6" . into ( ) ) ,
78+ Value :: String ( "11b" . into ( ) ) ,
79+ ] ;
80+
81+ let expected = [
82+ YosemiteDecimalGrade {
83+ grade : 9 ,
84+ letter : None ,
85+ } ,
86+ YosemiteDecimalGrade {
87+ grade : 10 ,
88+ letter : Some ( YosemiteDecimalLetter :: A ) ,
89+ } ,
90+ YosemiteDecimalGrade {
91+ grade : 10 ,
92+ letter : Some ( YosemiteDecimalLetter :: B ) ,
93+ } ,
94+ YosemiteDecimalGrade {
95+ grade : 10 ,
96+ letter : Some ( YosemiteDecimalLetter :: C ) ,
97+ } ,
98+ YosemiteDecimalGrade {
99+ grade : 10 ,
100+ letter : Some ( YosemiteDecimalLetter :: D ) ,
101+ } ,
102+ YosemiteDecimalGrade {
103+ grade : 6 ,
104+ letter : None ,
105+ } ,
106+ YosemiteDecimalGrade {
107+ grade : 11 ,
108+ letter : Some ( YosemiteDecimalLetter :: B ) ,
109+ } ,
110+ ] ;
111+
112+ for ( v, e) in values. iter ( ) . zip ( expected. iter ( ) ) {
113+ assert_eq ! ( YosemiteDecimalGrade :: parse( v. clone( ) ) . unwrap( ) , * e) ;
114+ }
115+ }
116+
117+ #[ test]
118+ fn parse_bad ( ) {
119+ let values = [
120+ Value :: Number ( 0 . into ( ) ) , // only string-values accepted
121+ Value :: String ( "f8a" . into ( ) ) , // invalid format
122+ Value :: String ( "5.0" . into ( ) ) , // grades start a 1
123+ Value :: String ( "5.9a" . into ( ) ) , // grades 9 and below must not have a letter
124+ Value :: String ( "5.10" . into ( ) ) , // grades 10 and above must have a letter
125+ ] ;
126+
127+ for v in values. iter ( ) {
128+ // An error is an error, regardless of fields (for now)
129+ assert ! (
130+ matches!( YosemiteDecimalGrade :: parse( v. clone( ) ) , Err ( InputValueError { .. } ) ) ,
131+ "{} expected to fail parsing but didn't" , v
132+ ) ;
133+ }
134+ }
135+
136+ #[ test]
137+ fn to_value ( ) {
138+ let grades = [
139+ YosemiteDecimalGrade { grade : 9 , letter : None } ,
140+ YosemiteDecimalGrade { grade : 10 , letter : Some ( YosemiteDecimalLetter :: A ) } ,
141+ YosemiteDecimalGrade { grade : 10 , letter : Some ( YosemiteDecimalLetter :: B ) } ,
142+ YosemiteDecimalGrade { grade : 10 , letter : Some ( YosemiteDecimalLetter :: C ) } ,
143+ YosemiteDecimalGrade { grade : 10 , letter : Some ( YosemiteDecimalLetter :: D ) } ,
144+ ] ;
145+
146+ let expected = [
147+ "5.9" ,
148+ "5.10a" ,
149+ "5.10b" ,
150+ "5.10c" ,
151+ "5.10d" ,
152+ ] ;
153+
154+ for ( g, e) in grades. iter ( ) . zip ( expected. iter ( ) ) {
155+ assert_eq ! ( g. to_value( ) , Value :: String ( e. to_string( ) ) ) ;
156+ }
157+ }
158+ }
0 commit comments