@@ -150,6 +150,67 @@ TEST(FileNameTest, IsFormattable) {
150150  EXPECT_EQ (absl::StrFormat (" foo %v baz" " foo bar äα𝐴🐈' baz" 
151151}
152152
153+ TEST (FileNameTest, ParentRejectsRoot) {
154+   EXPECT_THAT (FileName::FromString (kWindows  ? RULES_ELISP_NATIVE_LITERAL (" C:\\ " 
155+                                             : RULES_ELISP_NATIVE_LITERAL (" /" 
156+                   .value ()
157+                   .Parent (),
158+               StatusIs (absl::StatusCode::kInvalidArgument ));
159+ }
160+ 
161+ TEST (FileNameTest, ParentRejectsDot) {
162+   EXPECT_THAT (FileName::FromString (RULES_ELISP_NATIVE_LITERAL (" foo/." 
163+                   .value ()
164+                   .Parent (),
165+               StatusIs (absl::StatusCode::kInvalidArgument ));
166+ }
167+ 
168+ TEST (FileNameTest, ParentRejectsDotDot) {
169+   EXPECT_THAT (FileName::FromString (RULES_ELISP_NATIVE_LITERAL (" foo/.." 
170+                   .value ()
171+                   .Parent (),
172+               StatusIs (absl::StatusCode::kInvalidArgument ));
173+ }
174+ 
175+ TEST (FileNameTest, ParentWorksForRelativeName) {
176+   EXPECT_THAT (
177+       FileName::FromString (RULES_ELISP_NATIVE_LITERAL (" foo/bar" 
178+           .value ()
179+           .Parent (),
180+       IsOkAndHolds (
181+           FileName::FromString (RULES_ELISP_NATIVE_LITERAL (" foo" value ()));
182+ }
183+ 
184+ TEST (FileNameTest, ParentWorksForAbsoluteName) {
185+   EXPECT_THAT (
186+       FileName::FromString (kWindows  ? RULES_ELISP_NATIVE_LITERAL (" C:\\ Foo" 
187+                                     : RULES_ELISP_NATIVE_LITERAL (" /foo" 
188+           .value ()
189+           .Parent (),
190+       IsOkAndHolds (FileName::FromString (kWindows 
191+                                             ? RULES_ELISP_NATIVE_LITERAL (" C:\\ " 
192+                                             : RULES_ELISP_NATIVE_LITERAL (" /" 
193+                        .value ()));
194+   EXPECT_THAT (
195+       FileName::FromString (kWindows  ? RULES_ELISP_NATIVE_LITERAL (" C:\\ Foo\\ Bar" 
196+                                     : RULES_ELISP_NATIVE_LITERAL (" /foo/bar" 
197+           .value ()
198+           .Parent (),
199+       IsOkAndHolds (
200+           FileName::FromString (kWindows  ? RULES_ELISP_NATIVE_LITERAL (" C:\\ Foo" 
201+                                         : RULES_ELISP_NATIVE_LITERAL (" /foo" 
202+               .value ()));
203+ }
204+ 
205+ TEST (FileNameTest, ParentIgnoresTrailingSlashes) {
206+   EXPECT_THAT (
207+       FileName::FromString (RULES_ELISP_NATIVE_LITERAL (" foo/bar//" 
208+           .value ()
209+           .Parent (),
210+       IsOkAndHolds (
211+           FileName::FromString (RULES_ELISP_NATIVE_LITERAL (" foo" value ()));
212+ }
213+ 
153214TEST (FileNameTest, ChildRejectsDescendant) {
154215  const  FileName parent =
155216      FileName::FromString (RULES_ELISP_NATIVE_LITERAL (" foo" value ();
0 commit comments