1818package org .apache .commons .io .file .attribute ;
1919
2020import static org .junit .jupiter .api .Assertions .assertEquals ;
21+ import static org .junit .jupiter .api .Assertions .assertNull ;
2122
23+ import java .nio .file .attribute .FileTime ;
2224import java .time .Instant ;
25+ import java .util .Date ;
26+ import java .util .stream .Stream ;
2327
2428import org .junit .jupiter .api .Test ;
29+ import org .junit .jupiter .params .ParameterizedTest ;
30+ import org .junit .jupiter .params .provider .Arguments ;
31+ import org .junit .jupiter .params .provider .MethodSource ;
2532
2633/**
2734 * Tests {@link FileTimes}.
2835 */
2936public class FileTimesTest {
3037
38+ public static Stream <Arguments > dateToNtfsProvider () {
39+ // @formatter:off
40+ return Stream .of (
41+ Arguments .of ("1601-01-01T00:00:00.000Z" , 0 ),
42+ Arguments .of ("1601-01-01T00:00:00.000Z" , 1 ),
43+ Arguments .of ("1600-12-31T23:59:59.999Z" , -1 ),
44+ Arguments .of ("1601-01-01T00:00:00.001Z" , FileTimes .HUNDRED_NANOS_PER_MILLISECOND ),
45+ Arguments .of ("1601-01-01T00:00:00.001Z" , FileTimes .HUNDRED_NANOS_PER_MILLISECOND + 1 ),
46+ Arguments .of ("1601-01-01T00:00:00.000Z" , FileTimes .HUNDRED_NANOS_PER_MILLISECOND - 1 ),
47+ Arguments .of ("1600-12-31T23:59:59.999Z" , -FileTimes .HUNDRED_NANOS_PER_MILLISECOND ),
48+ Arguments .of ("1600-12-31T23:59:59.999Z" , -FileTimes .HUNDRED_NANOS_PER_MILLISECOND + 1 ),
49+ Arguments .of ("1600-12-31T23:59:59.998Z" , -FileTimes .HUNDRED_NANOS_PER_MILLISECOND - 1 ),
50+ Arguments .of ("1970-01-01T00:00:00.000Z" , -FileTimes .WINDOWS_EPOCH_OFFSET ),
51+ Arguments .of ("1970-01-01T00:00:00.000Z" , -FileTimes .WINDOWS_EPOCH_OFFSET + 1 ),
52+ Arguments .of ("1970-01-01T00:00:00.001Z" , -FileTimes .WINDOWS_EPOCH_OFFSET + FileTimes .HUNDRED_NANOS_PER_MILLISECOND ),
53+ Arguments .of ("1969-12-31T23:59:59.999Z" , -FileTimes .WINDOWS_EPOCH_OFFSET - 1 ),
54+ Arguments .of ("1969-12-31T23:59:59.999Z" , -FileTimes .WINDOWS_EPOCH_OFFSET - FileTimes .HUNDRED_NANOS_PER_MILLISECOND ));
55+ // @formatter:on
56+ }
57+
58+ public static Stream <Arguments > fileTimeToNtfsProvider () {
59+ // @formatter:off
60+ return Stream .of (
61+ Arguments .of ("1601-01-01T00:00:00.0000000Z" , 0 ),
62+ Arguments .of ("1601-01-01T00:00:00.0000001Z" , 1 ),
63+ Arguments .of ("1600-12-31T23:59:59.9999999Z" , -1 ),
64+ Arguments .of ("1601-01-01T00:00:00.0010000Z" , FileTimes .HUNDRED_NANOS_PER_MILLISECOND ),
65+ Arguments .of ("1601-01-01T00:00:00.0010001Z" , FileTimes .HUNDRED_NANOS_PER_MILLISECOND + 1 ),
66+ Arguments .of ("1601-01-01T00:00:00.0009999Z" , FileTimes .HUNDRED_NANOS_PER_MILLISECOND - 1 ),
67+ Arguments .of ("1600-12-31T23:59:59.9990000Z" , -FileTimes .HUNDRED_NANOS_PER_MILLISECOND ),
68+ Arguments .of ("1600-12-31T23:59:59.9990001Z" , -FileTimes .HUNDRED_NANOS_PER_MILLISECOND + 1 ),
69+ Arguments .of ("1600-12-31T23:59:59.9989999Z" , -FileTimes .HUNDRED_NANOS_PER_MILLISECOND - 1 ),
70+ Arguments .of ("1970-01-01T00:00:00.0000000Z" , -FileTimes .WINDOWS_EPOCH_OFFSET ),
71+ Arguments .of ("1970-01-01T00:00:00.0000001Z" , -FileTimes .WINDOWS_EPOCH_OFFSET + 1 ),
72+ Arguments .of ("1970-01-01T00:00:00.0010000Z" , -FileTimes .WINDOWS_EPOCH_OFFSET + FileTimes .HUNDRED_NANOS_PER_MILLISECOND ),
73+ Arguments .of ("1969-12-31T23:59:59.9999999Z" , -FileTimes .WINDOWS_EPOCH_OFFSET - 1 ),
74+ Arguments .of ("1969-12-31T23:59:59.9990000Z" , -FileTimes .WINDOWS_EPOCH_OFFSET - FileTimes .HUNDRED_NANOS_PER_MILLISECOND ));
75+ // @formatter:on
76+ }
77+
78+ @ ParameterizedTest
79+ @ MethodSource ("dateToNtfsProvider" )
80+ public void testDateToFileTime (final String instant , final long ignored ) {
81+ final Instant parsedInstant = Instant .parse (instant );
82+ final FileTime parsedFileTime = FileTime .from (parsedInstant );
83+ final Date parsedDate = Date .from (parsedInstant );
84+ assertEquals (parsedFileTime , FileTimes .toFileTime (parsedDate ));
85+ }
86+
87+ @ ParameterizedTest
88+ @ MethodSource ("dateToNtfsProvider" )
89+ public void testDateToNtfsTime (final String instant , final long ntfsTime ) {
90+ final long ntfsMillis = Math .floorDiv (ntfsTime , FileTimes .HUNDRED_NANOS_PER_MILLISECOND ) * FileTimes .HUNDRED_NANOS_PER_MILLISECOND ;
91+ final Date parsed = Date .from (Instant .parse (instant ));
92+ assertEquals (ntfsMillis , FileTimes .toNtfsTime (parsed ));
93+ }
94+
3195 @ Test
3296 public void testEpoch () {
3397 assertEquals (0 , FileTimes .EPOCH .toMillis ());
3498 }
3599
100+ @ ParameterizedTest
101+ @ MethodSource ("fileTimeToNtfsProvider" )
102+ public void testFileTimeToDate (final String instant , final long ignored ) {
103+ final Instant parsedInstant = Instant .parse (instant );
104+ final FileTime parsedFileTime = FileTime .from (parsedInstant );
105+ final Date parsedDate = Date .from (parsedInstant );
106+ assertEquals (parsedDate , FileTimes .toDate (parsedFileTime ));
107+ }
108+
109+ @ ParameterizedTest
110+ @ MethodSource ("fileTimeToNtfsProvider" )
111+ public void testFileTimeToNtfsTime (final String instant , final long ntfsTime ) {
112+ final FileTime parsed = FileTime .from (Instant .parse (instant ));
113+ assertEquals (ntfsTime , FileTimes .toNtfsTime (parsed ));
114+ }
115+
116+ //
117+
36118 @ Test
37119 public void testMinusMillis () {
38120 final int millis = 2 ;
@@ -54,6 +136,29 @@ public void testMinusSeconds() {
54136 assertEquals (Instant .EPOCH , FileTimes .minusSeconds (FileTimes .EPOCH , 0 ).toInstant ());
55137 }
56138
139+ @ ParameterizedTest
140+ @ MethodSource ("dateToNtfsProvider" )
141+ public void testNtfsTimeToDate (final String instant , final long ntfsTime ) {
142+ assertEquals (Instant .parse (instant ), FileTimes .ntfsTimeToDate (ntfsTime ).toInstant ());
143+ }
144+
145+ @ ParameterizedTest
146+ @ MethodSource ("fileTimeToNtfsProvider" )
147+ public void testNtfsTimeToFileTime (final String instant , final long ntfsTime ) {
148+ final FileTime parsed = FileTime .from (Instant .parse (instant ));
149+ assertEquals (parsed , FileTimes .ntfsTimeToFileTime (ntfsTime ));
150+ }
151+
152+ @ Test
153+ public void testNullDateToNullFileTime () {
154+ assertNull (FileTimes .toFileTime (null ));
155+ }
156+
157+ @ Test
158+ public void testNullFileTimeToNullDate () {
159+ assertNull (FileTimes .toDate (null ));
160+ }
161+
57162 @ Test
58163 public void testPlusMinusMillis () {
59164 final int millis = 2 ;
@@ -74,5 +179,4 @@ public void testPlusSeconds() {
74179 assertEquals (Instant .EPOCH .plusSeconds (seconds ), FileTimes .plusSeconds (FileTimes .EPOCH , seconds ).toInstant ());
75180 assertEquals (Instant .EPOCH , FileTimes .plusSeconds (FileTimes .EPOCH , 0 ).toInstant ());
76181 }
77-
78182}
0 commit comments