33 Disjoint ,
44 boundKindPairsByLower ,
55 rootSchema ,
6- writeInvalidLengthBoundMessage
6+ writeInvalidLengthBoundMessage ,
7+ writeInvalidSizeBoundMessage
78} from "@ark/schema"
89import { entriesOf , flatMorph } from "@ark/util"
910
@@ -19,6 +20,11 @@ const dateCases = flatMorph(numericCases, (name, v) => [name, new Date(v)])
1920
2021const lengthCases = flatMorph ( numericCases , ( name , v ) => [ name , "1" . repeat ( v ) ] )
2122
23+ const fileCases = flatMorph ( numericCases , ( name , v ) => [
24+ name ,
25+ new File ( [ "x" . repeat ( v ) ] , "test.txt" )
26+ ] )
27+
2228contextualize ( ( ) => {
2329 it ( "numeric apply" , ( ) => {
2430 const T = rootSchema ( {
@@ -86,6 +92,45 @@ contextualize(() => {
8692 )
8793 } )
8894
95+ it ( "file apply" , ( ) => {
96+ const T = rootSchema ( {
97+ proto : File ,
98+ minSize : { rule : 5 , exclusive : true } ,
99+ maxSize : { rule : 10 }
100+ } )
101+
102+ attest ( T . traverse ( fileCases . lessThanMin ) ?. toString ( ) ) . snap (
103+ "must be more than 5 bytes (was 4 bytes)"
104+ )
105+ attest ( T . traverse ( fileCases . equalToExclusiveMin ) ?. toString ( ) ) . snap (
106+ "must be more than 5 bytes (was 5 bytes)"
107+ )
108+ attest ( T . traverse ( fileCases . between ) ) . equals ( fileCases . between )
109+ attest ( T . traverse ( fileCases . equalToInclusiveMax ) ) . equals (
110+ fileCases . equalToInclusiveMax
111+ )
112+ attest ( T . traverse ( fileCases . greaterThanMax ) ?. toString ( ) ) . snap (
113+ "must be at most 10 bytes (was 11 bytes)"
114+ )
115+ } )
116+
117+ it ( "errors on negative size bound" , ( ) => {
118+ attest ( ( ) => rootSchema ( { proto : File , maxSize : - 1 } ) ) . throws (
119+ writeInvalidSizeBoundMessage ( "maxSize" , - 1 )
120+ )
121+ } )
122+
123+ it ( "errors on non-integer size bound" , ( ) => {
124+ attest ( ( ) => rootSchema ( { proto : File , minSize : 1.5 } ) ) . throws (
125+ writeInvalidSizeBoundMessage ( "minSize" , 1.5 )
126+ )
127+ } )
128+
129+ it ( "minSize 0 reduces to unconstrained" , ( ) => {
130+ const T = rootSchema ( { proto : File , minSize : 0 } )
131+ attest ( T . expression ) . snap ( "File" )
132+ } )
133+
89134 it ( "errors on negative length bound" , ( ) => {
90135 attest ( ( ) => rootSchema ( { domain : "string" , maxLength : - 1 } ) ) . throws (
91136 writeInvalidLengthBoundMessage ( "maxLength" , - 1 )
@@ -108,10 +153,12 @@ contextualize(() => {
108153 const basis =
109154 min === "min" ? { domain : "number" }
110155 : min === "minLength" ? { domain : "string" }
156+ : min === "minSize" ? { proto : File }
111157 : { proto : Date }
112158 const cases =
113159 min === "min" ? numericCases
114160 : min === "minLength" ? lengthCases
161+ : min === "minSize" ? fileCases
115162 : dateCases
116163
117164 it ( "allows" , ( ) => {
@@ -151,6 +198,12 @@ contextualize(() => {
151198 ...basis ,
152199 exactLength : 6
153200 } as never )
201+ : min === "minSize" ?
202+ rootSchema ( {
203+ ...basis ,
204+ minSize : { rule : 6 } ,
205+ maxSize : { rule : 6 }
206+ } as never )
154207 : rootSchema ( {
155208 unit : new Date ( 6 )
156209 } )
0 commit comments