
Constantine
26.06.2017
16:44:11
так что std::initializer_list<const char*> ему не подходит

Arseny
26.06.2017
16:45:51
Но в случае vector<string>({"A", "B"}); семантика какая-то иная?

Constantine
26.06.2017
16:46:06
std::initializer_list<std::string> list = { "A", "B" };
std::make_unique<std::vector<std::string>>(std::move(list)); //OK

Google

Arseny
26.06.2017
16:49:25
Интересно баг это стандарта или фича. В смысле планируется ли исправлять.
Еще и move-ать initializer list нельзя, как я помню.

Constantine
26.06.2017
16:49:53
вероятно прикол в том, что нельзя мувать и создавать из ссылок
хотя это парадокс
std::initializer_list<std::string> list = { "A", "B" };
это же скомпилировалось

Arseny
26.06.2017
16:52:31
Так и vector<string> v = {"A", "B"}; компилируется

Berkus
26.06.2017
16:52:52

Arseny
26.06.2017
16:54:03

Александр
26.06.2017
16:56:56
к спору выше: все же помнят, что string умеет конструироваться из (const char* it_begin, const char* it_end), причем для литералов будет нерабочий код?

Constantine
26.06.2017
16:59:04

Alex Фэils?︙
26.06.2017
20:48:25
Moved to #holywar s

pinnokio
26.06.2017
20:57:27
Алекс, что за фигня: вбросы про джаву и "си++ несовсместим с перформансом" - это ок, а разговор про смарты - холивар? dafuq?

Tema
26.06.2017
21:01:57

Google

Berkus
26.06.2017
21:13:08

Vladislav
26.06.2017
22:10:34

Constantine
26.06.2017
22:11:20
Так нет же разницы между в С++ и яве

Vladislav
26.06.2017
22:11:54

Constantine
26.06.2017
22:12:29

Alexandr
26.06.2017
22:25:37
Не факт. В даже фактически унаследоваться можно не более, чем от одного класса, но реализовать сколь угодно много интерфейсов

Constantine
26.06.2017
22:27:47
А какая разница снизу? Будет тот же самый QueryInterface код, только в С++ это будет QuerySomeBase

Vladislav
26.06.2017
22:31:54

Constantine
26.06.2017
22:32:25

Vladislav
26.06.2017
22:33:11

Berkus
26.06.2017
22:34:17

Antonio
26.06.2017
22:46:01
Список книг, видео и курсов по машинному обучению и математике, всё на русском языке. Большая, качественная подборка. Почти все pdf'ки книг гуглятся.
https://ru.stackoverflow.com/a/683632/1084

Vladislav
26.06.2017
22:47:40

Antonio
26.06.2017
22:48:04
Вообще то в топе там самый свежак
Но есть и классика да, она может быть старая, но никогда не теряет акутальности, её просто надо знать

Evgeniy
26.06.2017
22:49:43

Vladislav
26.06.2017
22:50:37

Aldar
26.06.2017
22:51:03
бред изучать мл на русском

Roman
26.06.2017
22:51:48
макрос:
#define $Test(casename) void casename (testing::TestCase* test)
используется так:
$Test(verifyCase) {
//...
}
$Add(verifyCase)
хотелось бы исбавиться от $Add и при вызове макроса $Test зарегистрировать созданную функцию в глобальном объекте типа:
...
testing::Test::getInstance().define( casename )
...
но к сожалению ДО определения функции этого сделать не получается по очевидной причине, взять function body в качестве параметра макроса не могу, ибо тогда весь body inline'ится в одну строку и __LINE__ отображает конечную строку макроса
есть какой нибудь Workaround?

Владислав
26.06.2017
22:52:01

Google

Berkus
26.06.2017
22:54:27

Roman
26.06.2017
22:55:09

Berkus
26.06.2017
22:55:23
мне норм

Roman
26.06.2017
22:55:55

Vladislav
26.06.2017
22:56:15

Владислав
26.06.2017
22:56:33
язык пушкина, есенина и маяковского

Roman
26.06.2017
22:57:20

Владислав
26.06.2017
22:57:32
зря вы так

Aldar
26.06.2017
22:57:49
зачем учить на русском, если можно на английском и все термины сразу понимать

Berkus
26.06.2017
22:57:53
в смысле?
в смысле тестирую асинхронный код в Catch и boost.test и все норм

Vladislav
26.06.2017
22:58:14

Roman
26.06.2017
22:58:57

Владислав
26.06.2017
22:58:59
давай зачётку

Vladislav
26.06.2017
22:59:40
Английский сейчас - как латынь раньше, изучать что-то на других языках (научно/техническое) - контрпродуктивно

Roman
26.06.2017
23:00:09

Владислав
26.06.2017
23:00:14
Да это ясно, я ж шучу
Просто есть такая штука как языковой барьер

Vladislav
26.06.2017
23:01:36

Berkus
26.06.2017
23:04:10
а как именно, поясни плиз
ну так тебе ж надо проверить что асинхронная операция что-то сделает, запускаешь ее в одном треде, вейт фьючура с таймаутом в основном, и вперёд

Roman
26.06.2017
23:04:49
короче суть в том, что мой вопрос относится не к unit-testing'у а functional testing'у в котором доказывается верная работоспособность асинхронных сущностей..
придам пример (грубый, но пойдёт)
testCase() {
readFile("/this/file.txt", [](std::string result) {
// will never execute
ASSERT(result, expected)
});
}
testCase не дождётся результата и завершится, ASSERT никогда не проверится

Google

Roman
26.06.2017
23:06:04
для того чтоб тест правильно выполнился нужно изменить его немного:
testCase(test) {
readFile("/this/file.txt", [](std::string result) {
ASSERT(result, expected)
test.finish()
});
}
в данном случае тест либо дождётся вызова асинхронного callback'а либо timeout'ит

Berkus
26.06.2017
23:07:18
testCase() {
readFile("/this/file.txt", [](std::string result) {
ASSERT(result, expected)
future.set(true);
});
future.waitWithTimeout();
}

Admin
ERROR: S client not available

Roman
26.06.2017
23:11:59
библиотека которую я хочу протестить не столь проста
streams.create([](handle) {
handle.close("data")
})
.attach([](data, handle) {
ASSERT(data, "data")
handle.fail("fuck")
})
.failure([](error, handle) {
ASSERT(error, "fuck")
})
в данном случае мы создаём асинхронный объект, который при закрытии запускает при'attach'енный второй объект
короче говоря: нужно доказать, что control flow шёл правильным путём и что данные были верно переданы

Berkus
26.06.2017
23:13:28
и ты пишешь для этого тестинг фреймворк?

Roman
26.06.2017
23:14:04
я пытаюсь протестировать код)) но не могу найти правильный подход
т.е. создать просто несколько future'ов и ими блокировать завершение тестовой функции?
а с макросами я просто эксперементирую, может и так можно решить проблему
кстати.. почему finish() это костыль, интересен аргумент(ы)


Berkus
26.06.2017
23:15:15
я бы разложил фьючеры по пути следования и в конце подождал чтобы они все стали с верными значениями
кстати.. почему finish() это костыль, интересен аргумент(ы)
я уже не помню как оно работало в моче или в чае, но когда начали его портировать на промисы и асинхронщину, любой забытый done() превращал отладку в ад - тест мог не закончиться или закончиться с непонятной совершенно ошибкой глубоко в кишках тест фреймворка. в ++ типизация построже конечно, но лучше не делать _специальный_флаг_завершения_теста_ пушо его всяко кто-нибудь забудет вызвать в замороченном случае и будет плеваться. с твоим вложенным путем исполнения где надо finish() а где не надо? да пофиг на самом деле, он ведь асинхронный, а ожидать выполнения мы должны в основном треде если толково это делать


Roman
26.06.2017
23:19:39
в моём эксперементальном решении это невозможно, ставится определённый timeout, по истечению которого кейс убивается, т.е. если кто-то где-то забыл done() вызвать то этот кейс в результатах будет помечен как fail (timeout)

Berkus
26.06.2017
23:20:15
а таймаут у тебя глобальный для всех кейсов?
что если одни асинхронные операции завершаются за 1 секунду а другие за 100?

Roman
26.06.2017
23:20:37
есть default timeout, который определяется всем кейсам, да

Antonio
26.06.2017
23:21:07

Berkus
26.06.2017
23:21:16
ну то есть ты не можешь сделать в одном тест кейсе три фьючера и ждать один с таймаутом 1, второй с таймаутом 10 и третий с таймаутом 100?

Google

Roman
26.06.2017
23:21:18

Berkus
26.06.2017
23:21:27
кейсам да
а путям внутри одного кейса?

Roman
26.06.2017
23:22:27
кейс он неделимый

Berkus
26.06.2017
23:22:43
ну ок, твои кейсы тебе и решать

Roman
26.06.2017
23:22:48
ты ему определяешь таймаут, если кейс не завершается, например по причине забытого done(), тогда - failure (timeout)
кейсы не должны быть слишком большими, забыть done() не так легко, ибо просто будет постоянно таймаутить, а значит что-то не так

Constantine
26.06.2017
23:24:02
или тестирование такое, что наличие лишнего барьера памяти все поломает?

Berkus
26.06.2017
23:25:54

Roman
26.06.2017
23:26:00
с future'ами проблема идентичная... если неправильно выставить timeout'ы или забывать завершать future... но там будет больше boiler plate кода чем с done()

Constantine
26.06.2017
23:26:06

Berkus
26.06.2017
23:26:41
у future уже есть флаг, done() вводит глобальный стейт в тесткейсы, который в целом не нужен
на уровне тест-фреймворка это ненужная сущность