LU Lua  ·  25 вопросов  ·  ~70 мин  ·  ⏱ Таймер 10:00  ·  Средний  · 

Встраивание Lua в приложение

Тест по теме «Встраивание Lua в приложение» проверяет чтение кода, поиск скрытых допущений и выбор решения для обычных и граничных сценариев. В нём 25 вопросов, из них 14 содержат фрагменты Lua и C API. Условия отдельно отмечают случаи, зависящие от версии языка или внешней библиотеки.

Отвечено: 0 из 25
⏱ --:--
0%
💡 Инструкция: В каждом вопросе выберите один ответ из пяти. На работу отведено 70 минут. После завершения можно посмотреть правильные ответы, объяснения и результат по каждой теме.
Вопрос 1 из 25
На каком правиле держится поведение этого кода? Ответ должен описывать основной механизм раздела «Состояние интерпретатора Lua».
CLua · Состояние интерпретатора Lua · разбор 1
/* Проверьте состояние стека и время жизни ресурсов. */
/* C */
lua_State *L = luaL_newstate();
luaL_openlibs(L);
if (luaL_dostring(L, "return 6*7") == LUA_OK) {
  printf("%lld\n", (long long)lua_tointeger(L, -1));
}
lua_close(L);
Вопрос 2 из 25
Какое последствие проявится только при другом входе или повторном вызове? Выберите именно проверяемую границу раздела «Состояние интерпретатора Lua».
CLua · Состояние интерпретатора Lua · разбор 2
/* Тот же путь вызывается повторно после ошибки Lua. */
/* C */
lua_State *L = luaL_newstate();
luaL_openlibs(L);
if (luaL_dostring(L, "return 6*7") == LUA_OK) {
  printf("%lld\n", (long long)lua_tointeger(L, -1));
}
lua_close(L);
Вопрос 3 из 25
Какой результат обязан подтверждать регрессионный тест после правки? Нужен основной контракт раздела «Состояние интерпретатора Lua».
CLua · Состояние интерпретатора Lua · разбор 3
/* Рабочая версия обязана восстановить состояние на каждом выходе. */
/* C */
lua_State *L = luaL_newstate();
luaL_openlibs(L);
if (luaL_dostring(L, "return 6*7") == LUA_OK) {
  printf("%lld\n", (long long)lua_tointeger(L, -1));
}
lua_close(L);
Вопрос 4 из 25
Команда сокращает код в разделе «Состояние интерпретатора Lua». Как не потерять важное граничное поведение? Выберите практическое следствие раздела «Состояние интерпретатора Lua».
Вопрос 5 из 25
Что в разделе «Состояние интерпретатора Lua» является гарантией, а не привычкой конкретного проекта? Выберите описание, объединяющее механизм и границу раздела «Состояние интерпретатора Lua».
Вопрос 6 из 25
На каком правиле держится поведение этого кода? Выберите основное правило раздела «Стек C API».
CLua · Стек C API · разбор 1
/* Проверьте состояние стека и время жизни ресурсов. */
/* C */
int top = lua_gettop(L);
lua_getglobal(L, "transform");
lua_pushinteger(L, 4);
if (lua_pcall(L, 1, 1, 0) != LUA_OK) return report(L);
long result = (long)luaL_checkinteger(L, -1);
lua_settop(L, top);
Вопрос 7 из 25
Где этот код может повести себя иначе на границе? Нужен отрицательный сценарий для раздела «Стек C API».
CLua · Стек C API · разбор 2
/* Тот же путь вызывается повторно после ошибки Lua. */
/* C */
int top = lua_gettop(L);
lua_getglobal(L, "transform");
lua_pushinteger(L, 4);
if (lua_pcall(L, 1, 1, 0) != LUA_OK) return report(L);
long result = (long)luaL_checkinteger(L, -1);
lua_settop(L, top);
Вопрос 8 из 25
Какое правило должно остаться наблюдаемым после правки? Выберите гарантию, определяющую раздел «Стек C API».
CLua · Стек C API · разбор 3
/* Рабочая версия обязана восстановить состояние на каждом выходе. */
/* C */
int top = lua_gettop(L);
lua_getglobal(L, "transform");
lua_pushinteger(L, 4);
if (lua_pcall(L, 1, 1, 0) != LUA_OK) return report(L);
long result = (long)luaL_checkinteger(L, -1);
lua_settop(L, top);
Вопрос 9 из 25
В модуле меняют «Стек C API» и хотят сохранить диагностируемость. Какой подход надёжнее? Выберите практическое следствие раздела «Стек C API».
Вопрос 10 из 25
Какое правило раздела «Стек C API» стоит закрепить в тестах? Выберите описание, объединяющее механизм и границу раздела «Стек C API».
Вопрос 11 из 25
Какое правило Lua нужно применить, чтобы верно прочитать этот фрагмент? Выберите основное правило раздела «Регистрация функций».
CLua · Регистрация функций · разбор 1
/* Проверьте состояние стека и время жизни ресурсов. */
/* C */
static int l_scale(lua_State *L) {
  double factor = lua_tonumber(L, lua_upvalueindex(1));
  double value = luaL_checknumber(L, 1);
  lua_pushnumber(L, value * factor);
  return 1;
}
/* registration pushes factor, then lua_pushcclosure(L,l_scale,1) */
Вопрос 12 из 25
Что должен поймать отрицательный тест для этого фрагмента? Выберите именно проверяемую границу раздела «Регистрация функций».
CLua · Регистрация функций · разбор 2
/* Тот же путь вызывается повторно после ошибки Lua. */
/* C */
static int l_scale(lua_State *L) {
  double factor = lua_tonumber(L, lua_upvalueindex(1));
  double value = luaL_checknumber(L, 1);
  lua_pushnumber(L, value * factor);
  return 1;
}
/* registration pushes factor, then lua_pushcclosure(L,l_scale,1) */
Вопрос 13 из 25
После рефакторинга тесты должны защищать одно правило. Какое? Нужен основной контракт раздела «Регистрация функций».
CLua · Регистрация функций · разбор 3
/* Рабочая версия обязана восстановить состояние на каждом выходе. */
/* C */
static int l_scale(lua_State *L) {
  double factor = lua_tonumber(L, lua_upvalueindex(1));
  double value = luaL_checknumber(L, 1);
  lua_pushnumber(L, value * factor);
  return 1;
}
/* registration pushes factor, then lua_pushcclosure(L,l_scale,1) */
Вопрос 14 из 25
Решение по разделу «Регистрация функций» должно пережить обновление зависимости. Что фиксировать в контракте? Нужна эксплуатационная граница раздела «Регистрация функций».
Вопрос 15 из 25
Что нельзя вывести из одного удачного примера, но нужно знать о разделе «Регистрация функций»? Ответ должен охватывать весь раздел «Регистрация функций».
Вопрос 16 из 25
Какое правило Lua нужно применить, чтобы верно прочитать этот фрагмент? Нужна именно центральная гарантия раздела «Обработка ошибок».
CLua · Обработка ошибок · разбор 1
/* Проверьте состояние стека и время жизни ресурсов. */
/* C */
Resource *r = open_resource();
if (luaL_loadfile(L, path) != LUA_OK) { close_resource(r); return fail(L); }
if (lua_pcall(L, 0, 0, 0) != LUA_OK) { close_resource(r); return fail(L); }
close_resource(r);
Вопрос 17 из 25
Какой крайний случай важнее всего добавить к проверке? Нужен отрицательный сценарий для раздела «Обработка ошибок».
CLua · Обработка ошибок · разбор 2
/* Тот же путь вызывается повторно после ошибки Lua. */
/* C */
Resource *r = open_resource();
if (luaL_loadfile(L, path) != LUA_OK) { close_resource(r); return fail(L); }
if (lua_pcall(L, 0, 0, 0) != LUA_OK) { close_resource(r); return fail(L); }
close_resource(r);
Вопрос 18 из 25
Какое правило должно остаться наблюдаемым после правки? Нужен основной контракт раздела «Обработка ошибок».
CLua · Обработка ошибок · разбор 3
/* Рабочая версия обязана восстановить состояние на каждом выходе. */
/* C */
Resource *r = open_resource();
if (luaL_loadfile(L, path) != LUA_OK) { close_resource(r); return fail(L); }
if (lua_pcall(L, 0, 0, 0) != LUA_OK) { close_resource(r); return fail(L); }
close_resource(r);
Вопрос 19 из 25
Нужно сделать поведение «Обработка ошибок» предсказуемым для следующего разработчика. Что выбрать? Выберите практическое следствие раздела «Обработка ошибок».
Вопрос 20 из 25
Какое правило лучше всего описывает границы раздела «Обработка ошибок»? Ответ должен охватывать весь раздел «Обработка ошибок».
Вопрос 21 из 25
Почему этот фрагмент ведёт себя именно так? Нужна именно центральная гарантия раздела «Ошибки интеграции».
CLua · Ошибки интеграции · разбор 1
/* Проверьте состояние стека и время жизни ресурсов. */
/* C */
lua_rawgeti(L, LUA_REGISTRYINDEX, callback_ref);
lua_pushlightuserdata(L, context);
int rc = lua_pcall(L, 1, 0, 0);
/* callback_ref and context must outlive this call */
Вопрос 22 из 25
Первый пример подтверждает основной путь. Что проверить отдельно? Выберите именно проверяемую границу раздела «Ошибки интеграции».
CLua · Ошибки интеграции · разбор 2
/* Тот же путь вызывается повторно после ошибки Lua. */
/* C */
lua_rawgeti(L, LUA_REGISTRYINDEX, callback_ref);
lua_pushlightuserdata(L, context);
int rc = lua_pcall(L, 1, 0, 0);
/* callback_ref and context must outlive this call */
Вопрос 23 из 25
После рефакторинга тесты должны защищать одно правило. Какое? Нужен основной контракт раздела «Ошибки интеграции».
Вопрос 24 из 25
Нужно сделать поведение «Ошибки интеграции» предсказуемым для следующего разработчика. Что выбрать? Нужна эксплуатационная граница раздела «Ошибки интеграции».
Вопрос 25 из 25
Какое утверждение о разделе «Ошибки интеграции» наиболее полное и точное? Ответ должен охватывать весь раздел «Ошибки интеграции».

Ответьте на все 25 вопросов, чтобы получить результат

🔗 Встроить тест на свой сайт (iframe) ▼

Скопируйте код и вставьте в любое место на вашем сайте:

Также доступна прямая ссылка на embed-страницу