Тестировать невозможность компиляции
От: _NN_ www.nemerleweb.com
Дата: 19.02.19 08:08
Оценка:
Как сегодня правильно тестировать код, который не должен компилироваться ?

В принципе несложно вручную запустить компилятор и разбирать выхлоп, но может есть что-то готовое ?
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: Тестировать невозможность компиляции
От: BlackEric http://black-eric.lj.ru
Дата: 19.02.19 08:19
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>Как сегодня правильно тестировать код, который не должен компилироваться ?


А можно подробнее? Что там тестировать если оно не собирается? И зачем вам не собирающийся код?
https://github.com/BlackEric001
Re: Тестировать невозможность компиляции
От: Sinatr Германия  
Дата: 19.02.19 09:24
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>Как сегодня правильно тестировать код, который не должен компилироваться ?


О каких тестах идет речь? Все тесты, о который я знаю (unit tests, integration tests, ui test, и т.д.) прогоняются после компиляции.

_NN>В принципе несложно вручную запустить компилятор и разбирать выхлоп, но может есть что-то готовое ?


Предположу, что вы динамически комплируете что-то. Знаете о CodeDOM? Если что-то простое, в виде одного файла, то можно попытаться скомпилировать и посмотреть ошибки CompilerError:
                var options = new CompilerParameters();
                string source = "using System;static class Blablabla{...";
                var compile = provider.CompileAssemblyFromSource(options, source);
                if (compile.Errors.HasErrors)
                    foreach (CompilerError error in compile.Errors)
                    {
                       ...
                    }
---
ПроГLамеры объединяйтесь..
Re[2]: Тестировать невозможность компиляции
От: _NN_ www.nemerleweb.com
Дата: 19.02.19 11:01
Оценка:
Здравствуйте, BlackEric, Вы писали:

BE>Здравствуйте, _NN_, Вы писали:


_NN>>Как сегодня правильно тестировать код, который не должен компилироваться ?


BE>А можно подробнее? Что там тестировать если оно не собирается? И зачем вам не собирающийся код?


Например хочу запретить писать using(lock.LockAsync()), и требовать только using(await lock.LockAsync())
Или там запрет на передачу ссылочных типов , и хочу гарантировать , что в будущем никто не поменяет.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[2]: Тестировать невозможность компиляции
От: _NN_ www.nemerleweb.com
Дата: 19.02.19 11:04
Оценка:
Здравствуйте, Sinatr, Вы писали:

S>Здравствуйте, _NN_, Вы писали:


_NN>>Как сегодня правильно тестировать код, который не должен компилироваться ?


S>О каких тестах идет речь? Все тесты, о который я знаю (unit tests, integration tests, ui test, и т.д.) прогоняются после компиляции.


А как же тестируется компилятор на ошибочный код?
Я знаю как это можно решить.
Вопрос в том если есть что-нибудь готовое, чтобы не писать с нуля.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[3]: Тестировать невозможность компиляции
От: BlackEric http://black-eric.lj.ru
Дата: 19.02.19 12:00
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>Например хочу запретить писать using(lock.LockAsync()), и требовать только using(await lock.LockAsync())

_NN>Или там запрет на передачу ссылочных типов , и хочу гарантировать , что в будущем никто не поменяет.

StyleCop для .NET Core и .NET Standard

StyleCop следит за соблюдением заданных стилистических правил в коде. Несоответствия отображаются в редакторе Visual Studio и в виде сообщений на этапе компиляции. Можно использовать как готовый набор правил, так и создать свой, в котором для каждого правила определить тип сообщения (ошибка, предупреждение и т.д.).

Оно?
https://github.com/BlackEric001
Re[3]: Тестировать невозможность компиляции
От: RushDevion Россия  
Дата: 19.02.19 12:06
Оценка:
_NN>Например хочу запретить писать using(lock.LockAsync()), и требовать только using(await lock.LockAsync())
_NN>Или там запрет на передачу ссылочных типов , и хочу гарантировать , что в будущем никто не поменяет.

FxCop/Stylecop не? Только правила придется самому писать.
Resharper/Rider c custom code inspections. Не знаю только, умеют ли они в неинтерактивном режиме. Да и платные они.
Анализаторы кода. Не знаю, в каком это сейчас состоянии и живое ли вообще.
Re: Тестировать невозможность компиляции
От: Danchik Украина  
Дата: 19.02.19 12:45
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>Как сегодня правильно тестировать код, который не должен компилироваться ?


_NN>В принципе несложно вручную запустить компилятор и разбирать выхлоп, но может есть что-то готовое ?


Сейчас модно писать Рослиновские экстеншины. Вполне возможно запретить компиляцию кода, с вашей точки зрения невалидного.
Вот например, EF Core так валидирует SQL Injections: https://github.com/aspnet/EntityFrameworkCore/tree/master/src/EFCore.Analyzers
Re[3]: Тестировать невозможность компиляции
От: artelk  
Дата: 19.02.19 20:13
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>Например хочу запретить писать using(lock.LockAsync()), и требовать только using(await lock.LockAsync())

Вместо проверки некомпилируемости конструкции можно сделать по проллетарски
Assert.IsFalse(lock.LockAsync() is IDisposable);
Сойдет?

_NN>Или там запрет на передачу ссылочных типов , и хочу гарантировать , что в будущем никто не поменяет.

var constraints = typeof(ThatClass<>).GetGenericArguments()[0].GetGenericParameterConstraints();
Assert.IsOk(...);
Т.е. рефлексией распортрошить тип и проверить, разрешаются ли там ссылочные тип.
Re[2]: Тестировать невозможность компиляции
От: _NN_ www.nemerleweb.com
Дата: 19.02.19 21:09
Оценка:
Здравствуйте, Danchik, Вы писали:

D>Сейчас модно писать Рослиновские экстеншины. Вполне возможно запретить компиляцию кода, с вашей точки зрения невалидного.

D>Вот например, EF Core так валидирует SQL Injections: https://github.com/aspnet/EntityFrameworkCore/tree/master/src/EFCore.Analyzers

Я хотел бы что-нибудь вроде такого:
https://github.com/rsdn/nemerle/blob/master/ncc/testsuite/negative/access.n

    mb () : void {
    def _ = m3.f_private;       // E: is not accessible
    def _ = m3.f_protected;     // E: is not accessible
    def _ = m3.f_public;        // OK
    m3.m_public ();             // OK
    m3.m_private ();            // E: is not accessible
    m3.m_protected ();          // E: is not accessible
    M.M4.foo ();                // FIXME: cannot access `M.M4'

    def _ = list ();        // E: type `Nemerle.Core.list.*' is abstract and cannot be constructed
    def _ = foo ();         // E: type `foo' is abstract and cannot be constructed
    def _ = foo.A ();       // OK
    ()
}
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[3]: Тестироватю невозможность компиляции
От: Ночной Смотрящий Россия  
Дата: 20.02.19 11:27
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>Например хочу запретить писать using(lock.LockAsync()), и требовать только using(await lock.LockAsync())

_NN>Или там запрет на передачу ссылочных типов , и хочу гарантировать , что в будущем никто не поменяет.

Это называется статический анализ. Гугли про static analyser. Встроенное решение — FxCop. Самое продвинутое, наверное, ReSharper CommandLine Tools.
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[4]: Тестировать невозможность компиляции
От: Ночной Смотрящий Россия  
Дата: 20.02.19 11:27
Оценка:
Здравствуйте, RushDevion, Вы писали:

RD>Resharper/Rider c custom code inspections. Не знаю только, умеют ли они в неинтерактивном режиме. Да и платные они.


https://www.jetbrains.com/help/resharper/ReSharper_Command_Line_Tools.html
Бесплатно.
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[4]: Тестироватю невозможность компиляции
От: _NN_ www.nemerleweb.com
Дата: 20.02.19 11:39
Оценка:
Здравствуйте, Ночной Смотрящий, Вы писали:

НС>Здравствуйте, _NN_, Вы писали:


_NN>>Например хочу запретить писать using(lock.LockAsync()), и требовать только using(await lock.LockAsync())

_NN>>Или там запрет на передачу ссылочных типов , и хочу гарантировать , что в будущем никто не поменяет.

НС>Это называется статический анализ. Гугли про static analyser. Встроенное решение — FxCop. Самое продвинутое, наверное, ReSharper CommandLine Tools.

Почти , только я хотел бы , чтобы было легко описывать желаемое поведение .
См. пример http://rsdn.org/forum/dotnet/7378972.1
Автор: _NN_
Дата: 20.02.19
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[5]: Тестироватю невозможность компиляции
От: Sinix  
Дата: 21.02.19 12:19
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>>>Например хочу запретить писать using(lock.LockAsync()), и требовать только using(await lock.LockAsync())

Или анализатор рослина, или (если using(lock.LockAsync()) в принципе не компилируется)- Roslyn compilation. Аля https://stackoverflow.com/questions/32769630/how-to-compile-a-c-sharp-file-with-roslyn-programmatically
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.