[Request for review] PathHelpers + IoCodeAssertions
От: Sinix  
Дата: 24.06.17 12:36
Оценка: 10 (1)
Скинул сабж, предложения/замечания — вэлкам!
Примеры

        static void UseCases(string path)
        {
            IoCode.IsWellFormedPath(path, nameof(path));

            path = PathHelpers.EnsureContainerPath(path); // ensures that path ends with '\'
            Code.BugIf(
                PathHelpers.IsSimpleName(path),
                "Never can be simple name as EnsureContainerPath() was called before");

            if (PathHelpers.IsWellFormedRelativePath(path))
            {
                // ...
            }
        }


Код внутри самый дубовый, т.к. особой необходимости в перфомансе тут нет (если дело дошло до IO, проверка путей редко становится узким местом).
Плюс самостоятельно писать поддержку вот этих правил + win 10 long path + путей linux... Я когда-то такое делал, больше не хочу
Отредактировано 24.06.2017 12:37 Sinix . Предыдущая версия .
Re: [Request for review] PathHelpers + IoCodeAssertions
От: rameel https://github.com/rsdn/CodeJam
Дата: 26.06.17 10:00
Оценка: 48 (1)
Здравствуйте, Sinix, Вы писали:

S>Скинул сабж


Уже пригодилось

S>предложения/замечания — вэлкам!


Аннотации только добавил.

И вот здесь https://github.com/rsdn/CodeJam/blob/master/Main/src/IO/PathHelpers.cs#L22 поле _directorySeparatorChars нигде не используется. Трогать не стал
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Re: [Request for review] PathHelpers + IoCodeAssertions
От: rameel https://github.com/rsdn/CodeJam
Дата: 26.06.17 10:26
Оценка: 24 (1)
Здравствуйте, Sinix, Вы писали:

S>Скинул сабж, предложения/замечания — вэлкам!


Одно различие обнаружилось с .NET Core 2

Для a:\a\..a..\ в .NET Framework Path.GetFullPath(path) возвращает a:\a\
// .NET Framework
Path.GetFullPath(@"a:\a\..\a..\") // a:\a\ 

// NET Core 2
Path.GetFullPath(@"a:\a\..\a..\") // a:\a\..a..\
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Re[2]: [Request for review] PathHelpers + IoCodeAssertions
От: Sinix  
Дата: 26.06.17 11:45
Оценка:
Здравствуйте, rameel, Вы писали:

R>Для a:\a\..a..\ в .NET Framework Path.GetFullPath(path) возвращает a:\a\

Он от PAL зависит
https://github.com/dotnet/coreclr/blob/6ba74dc2a7194f8d6c86c3aeab572a074ef645c8/src/mscorlib/shared/System/IO/Path.Unix.cs#L20
https://github.com/dotnet/coreclr/blob/6ba74dc2a7194f8d6c86c3aeab572a074ef645c8/src/mscorlib/shared/System/IO/Path.Windows.cs#L35

+ валидация под win не выполняется для extended ("\\.\", "\\?\", or "\??\")-путей.
Получается, выбор из двух вариантов
— или зависим от платформы, но поведение совпадает с целевым фреймворком
— или имеем одинаковое поведение на всех платформах, но потом падаем при вызове методов фреймворка.

Я выбрал первый)

R>И вот здесь https://github.com/rsdn/CodeJam/blob/master/Main/src/IO/PathHelpers.cs#L22 поле _directorySeparatorChars нигде не используется. Трогать не стал

Fixed)
Re[3]: [Request for review] PathHelpers + IoCodeAssertions
От: rameel https://github.com/rsdn/CodeJam
Дата: 26.06.17 12:15
Оценка: 24 (1)
Здравствуйте, Sinix, Вы писали:

То ли жарко, то ли лыжи не едут. Решил все-таки посмотреть в независимом окружении. Создал 2 консольных проекта — один под взрослый фреймворк, второй под .NET Core. Результат — одинаковый в обоих случаях.
a:\a..\

Тем более странно, в тесте, запускаемом под решарпером я вижу другой результат. Надо бы отдельный проект с тестами сделать.
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Re[4]: [Request for review] PathHelpers + IoCodeAssertions
От: Sinix  
Дата: 26.06.17 12:56
Оценка:
Здравствуйте, rameel, Вы писали:


R>Тем более странно, в тесте, запускаемом под решарпером я вижу другой результат. Надо бы отдельный проект с тестами сделать.


А, тогда всё ещё проще. Решарпер временами глючит в multi-case тестах, лечится перезапуском студии. Баг не репортил, т.к. у меня он всего пару раз ловился.
Re[5]: [Request for review] PathHelpers + IoCodeAssertions
От: rameel https://github.com/rsdn/CodeJam
Дата: 26.06.17 14:05
Оценка: 24 (1)
Здравствуйте, Sinix, Вы писали:

S>А, тогда всё ещё проще. Решарпер временами глючит в multi-case тестах, лечится перезапуском студии. Баг не репортил, т.к. у меня он всего пару раз ловился.


Я добавил изолированный не multi-case тест, специально для этого случая. Результат:

[Test]
public void IsWellFormedTest()
{
    const string path = @"a:\a\..a..\";
    
    Console.WriteLine("{0} => `{1}`", path, Path.GetFullPath(path));
    Console.WriteLine("Assembly: {0}", typeof(Path).AssemblyQualifiedName);
    
    Assert.IsFalse(PathHelpers.IsWellFormedPath(path));
}


Под взрослым все ОК, как и должно быть. Под netcoreapp2.0 результаты вообще странные. Решарпер стабильно выдает такой результат.
  Expected: False
  But was:  True

a:\a\..a..\ => `a:\a\..a..\`
Assembly: System.IO.Path, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e


MSTest — первый запуск, все ОК
a:\a\..a..\ => `a:\a\..a\`
Assembly: System.IO.Path, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e


но последующие запуски выдают тоже, что и под решарпером до перезагрузки студии.

Отдельное консольное приложение (netcoreapp2.0, вин10) выдает такой результат: a:\a\..a..\

PS. проект для .NET Framework выдает такой же результат (a:\a\..a..\), и он отличается от того, что выводится во время теста.

PS. Я напутал в коде в первом сообщении, скопировал кусок не оттуда, но результат как там и написано. Просто я сначала в сообщение скопировал вывод программы, но для наглядности из чего оно получилось почему-то решил скопировать уже из окна теста в студии, ну и скопировал не ту строчку
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Отредактировано 26.06.2017 14:24 rameel . Предыдущая версия . Еще …
Отредактировано 26.06.2017 14:13 rameel . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.