Best JavaScript code snippet using playwright-internal
scorm_12.js
Source: scorm_12.js
1// This file is part of Moodle - http://moodle.org/2//3// Moodle is free software: you can redistribute it and/or modify4// it under the terms of the GNU General Public License as published by5// the Free Software Foundation, either version 3 of the License, or6// (at your option) any later version.7//8// Moodle is distributed in the hope that it will be useful,9// but WITHOUT ANY WARRANTY; without even the implied warranty of10// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the11// GNU General Public License for more details.12//13// You should have received a copy of the GNU General Public License14// along with Moodle. If not, see <http://www.gnu.org/licenses/>.15//16// SCORM 1.2 API Implementation17//18function SCORMapi1_2(def, cmiobj, cmiint, cmistring256, cmistring4096, scormdebugging, scormauto, scormid, cfgwwwroot, sesskey, scoid, attempt, viewmode, cmid, currentorg, autocommit) {19 var prerequrl = cfgwwwroot + "/mod/scorm/prereqs.php?a=" + scormid + "&scoid=" + scoid + "&attempt=" + attempt + "&mode=" + viewmode + "¤torg=" + currentorg + "&sesskey=" + sesskey;20 var datamodelurl = cfgwwwroot + "/mod/scorm/datamodel.php";21 var datamodelurlparams = "id=" + cmid + "&a=" + scormid + "&sesskey=" + sesskey + "&attempt=" + attempt + "&scoid=" + scoid;22 // Standard Data Type Definition23 CMIString256 = cmistring256;24 CMIString4096 = cmistring4096;25 CMITime = '^([0-2]{1}[0-9]{1}):([0-5]{1}[0-9]{1}):([0-5]{1}[0-9]{1})(\.[0-9]{1,2})?$';26 CMITimespan = '^([0-9]{2,4}):([0-9]{2}):([0-9]{2})(\.[0-9]{1,2})?$';27 CMIInteger = '^\\d+$';28 CMISInteger = '^-?([0-9]+)$';29 CMIDecimal = '^-?([0-9]{0,3})(\.[0-9]*)?$';30 CMIIdentifier = '^[\\u0021-\\u007E]{0,255}$';31 CMIFeedback = CMIString256; // This must be redefined32 CMIIndex = '[._](\\d+).';33 // Vocabulary Data Type Definition34 CMIStatus = '^passed$|^completed$|^failed$|^incomplete$|^browsed$';35 CMIStatus2 = '^passed$|^completed$|^failed$|^incomplete$|^browsed$|^not attempted$';36 CMIExit = '^time-out$|^suspend$|^logout$|^$';37 CMIType = '^true-false$|^choice$|^fill-in$|^matching$|^performance$|^sequencing$|^likert$|^numeric$';38 CMIResult = '^correct$|^wrong$|^unanticipated$|^neutral$|^([0-9]{0,3})?(\.[0-9]*)?$';39 NAVEvent = '^previous$|^continue$';40 // Children lists41 cmi_children = 'core,suspend_data,launch_data,comments,objectives,student_data,student_preference,interactions';42 core_children = 'student_id,student_name,lesson_location,credit,lesson_status,entry,score,total_time,lesson_mode,exit,session_time';43 score_children = 'raw,min,max';44 comments_children = 'content,location,time';45 objectives_children = 'id,score,status';46 correct_responses_children = 'pattern';47 student_data_children = 'mastery_score,max_time_allowed,time_limit_action';48 student_preference_children = 'audio,language,speed,text';49 interactions_children = 'id,objectives,time,type,correct_responses,weighting,student_response,result,latency';50 // Data ranges51 score_range = '0#100';52 audio_range = '-1#100';53 speed_range = '-100#100';54 weighting_range = '-100#100';55 text_range = '-1#1';56 // The SCORM 1.2 data model57 // Set up data model for each sco58 var datamodel = {};59 for(scoid in def){60 datamodel[scoid] = {61 'cmi._children':{'defaultvalue':cmi_children, 'mod':'r', 'writeerror':'402'},62 'cmi._version':{'defaultvalue':'3.4', 'mod':'r', 'writeerror':'402'},63 'cmi.core._children':{'defaultvalue':core_children, 'mod':'r', 'writeerror':'402'},64 'cmi.core.student_id':{'defaultvalue':def[scoid]['cmi.core.student_id'], 'mod':'r', 'writeerror':'403'},65 'cmi.core.student_name':{'defaultvalue':def[scoid]['cmi.core.student_name'], 'mod':'r', 'writeerror':'403'},66 'cmi.core.lesson_location':{'defaultvalue':def[scoid]['cmi.core.lesson_location'], 'format':CMIString256, 'mod':'rw', 'writeerror':'405'},67 'cmi.core.credit':{'defaultvalue':def[scoid]['cmi.core.credit'], 'mod':'r', 'writeerror':'403'},68 'cmi.core.lesson_status':{'defaultvalue':def[scoid]['cmi.core.lesson_status'], 'format':CMIStatus, 'mod':'rw', 'writeerror':'405'},69 'cmi.core.entry':{'defaultvalue':def[scoid]['cmi.core.entry'], 'mod':'r', 'writeerror':'403'},70 'cmi.core.score._children':{'defaultvalue':score_children, 'mod':'r', 'writeerror':'402'},71 'cmi.core.score.raw':{'defaultvalue':def[scoid]['cmi.core.score.raw'], 'format':CMIDecimal, 'range':score_range, 'mod':'rw', 'writeerror':'405'},72 'cmi.core.score.max':{'defaultvalue':def[scoid]['cmi.core.score.max'], 'format':CMIDecimal, 'range':score_range, 'mod':'rw', 'writeerror':'405'},73 'cmi.core.score.min':{'defaultvalue':def[scoid]['cmi.core.score.min'], 'format':CMIDecimal, 'range':score_range, 'mod':'rw', 'writeerror':'405'},74 'cmi.core.total_time':{'defaultvalue':def[scoid]['cmi.core.total_time'], 'mod':'r', 'writeerror':'403'},75 'cmi.core.lesson_mode':{'defaultvalue':def[scoid]['cmi.core.lesson_mode'], 'mod':'r', 'writeerror':'403'},76 'cmi.core.exit':{'defaultvalue':def[scoid]['cmi.core.exit'], 'format':CMIExit, 'mod':'w', 'readerror':'404', 'writeerror':'405'},77 'cmi.core.session_time':{'format':CMITimespan, 'mod':'w', 'defaultvalue':'00:00:00', 'readerror':'404', 'writeerror':'405'},78 'cmi.suspend_data':{'defaultvalue':def[scoid]['cmi.suspend_data'], 'format':CMIString4096, 'mod':'rw', 'writeerror':'405'},79 'cmi.launch_data':{'defaultvalue':def[scoid]['cmi.launch_data'], 'mod':'r', 'writeerror':'403'},80 'cmi.comments':{'defaultvalue':def[scoid]['cmi.comments'], 'format':CMIString4096, 'mod':'rw', 'writeerror':'405'},81 // deprecated evaluation attributes82 'cmi.evaluation.comments._count':{'defaultvalue':'0', 'mod':'r', 'writeerror':'402'},83 'cmi.evaluation.comments._children':{'defaultvalue':comments_children, 'mod':'r', 'writeerror':'402'},84 'cmi.evaluation.comments.n.content':{'defaultvalue':'', 'pattern':CMIIndex, 'format':CMIString256, 'mod':'rw', 'writeerror':'405'},85 'cmi.evaluation.comments.n.location':{'defaultvalue':'', 'pattern':CMIIndex, 'format':CMIString256, 'mod':'rw', 'writeerror':'405'},86 'cmi.evaluation.comments.n.time':{'defaultvalue':'', 'pattern':CMIIndex, 'format':CMITime, 'mod':'rw', 'writeerror':'405'},87 'cmi.comments_from_lms':{'mod':'r', 'writeerror':'403'},88 'cmi.objectives._children':{'defaultvalue':objectives_children, 'mod':'r', 'writeerror':'402'},89 'cmi.objectives._count':{'mod':'r', 'defaultvalue':'0', 'writeerror':'402'},90 'cmi.objectives.n.id':{'pattern':CMIIndex, 'format':CMIIdentifier, 'mod':'rw', 'writeerror':'405'},91 'cmi.objectives.n.score._children':{'pattern':CMIIndex, 'mod':'r', 'writeerror':'402'},92 'cmi.objectives.n.score.raw':{'defaultvalue':'', 'pattern':CMIIndex, 'format':CMIDecimal, 'range':score_range, 'mod':'rw', 'writeerror':'405'},93 'cmi.objectives.n.score.min':{'defaultvalue':'', 'pattern':CMIIndex, 'format':CMIDecimal, 'range':score_range, 'mod':'rw', 'writeerror':'405'},94 'cmi.objectives.n.score.max':{'defaultvalue':'', 'pattern':CMIIndex, 'format':CMIDecimal, 'range':score_range, 'mod':'rw', 'writeerror':'405'},95 'cmi.objectives.n.status':{'pattern':CMIIndex, 'format':CMIStatus2, 'mod':'rw', 'writeerror':'405'},96 'cmi.student_data._children':{'defaultvalue':student_data_children, 'mod':'r', 'writeerror':'402'},97 'cmi.student_data.mastery_score':{'defaultvalue':def[scoid]['cmi.student_data.mastery_score'], 'mod':'r', 'writeerror':'403'},98 'cmi.student_data.max_time_allowed':{'defaultvalue':def[scoid]['cmi.student_data.max_time_allowed'], 'mod':'r', 'writeerror':'403'},99 'cmi.student_data.time_limit_action':{'defaultvalue':def[scoid]['cmi.student_data.time_limit_action'], 'mod':'r', 'writeerror':'403'},100 'cmi.student_preference._children':{'defaultvalue':student_preference_children, 'mod':'r', 'writeerror':'402'},101 'cmi.student_preference.audio':{'defaultvalue':def[scoid]['cmi.student_preference.audio'], 'format':CMISInteger, 'range':audio_range, 'mod':'rw', 'writeerror':'405'},102 'cmi.student_preference.language':{'defaultvalue':def[scoid]['cmi.student_preference.language'], 'format':CMIString256, 'mod':'rw', 'writeerror':'405'},103 'cmi.student_preference.speed':{'defaultvalue':def[scoid]['cmi.student_preference.speed'], 'format':CMISInteger, 'range':speed_range, 'mod':'rw', 'writeerror':'405'},104 'cmi.student_preference.text':{'defaultvalue':def[scoid]['cmi.student_preference.text'], 'format':CMISInteger, 'range':text_range, 'mod':'rw', 'writeerror':'405'},105 'cmi.interactions._children':{'defaultvalue':interactions_children, 'mod':'r', 'writeerror':'402'},106 'cmi.interactions._count':{'mod':'r', 'defaultvalue':'0', 'writeerror':'402'},107 'cmi.interactions.n.id':{'pattern':CMIIndex, 'format':CMIIdentifier, 'mod':'w', 'readerror':'404', 'writeerror':'405'},108 'cmi.interactions.n.objectives._count':{'pattern':CMIIndex, 'mod':'r', 'defaultvalue':'0', 'writeerror':'402'},109 'cmi.interactions.n.objectives.n.id':{'pattern':CMIIndex, 'format':CMIIdentifier, 'mod':'w', 'readerror':'404', 'writeerror':'405'},110 'cmi.interactions.n.time':{'pattern':CMIIndex, 'format':CMITime, 'mod':'w', 'readerror':'404', 'writeerror':'405'},111 'cmi.interactions.n.type':{'pattern':CMIIndex, 'format':CMIType, 'mod':'w', 'readerror':'404', 'writeerror':'405'},112 'cmi.interactions.n.correct_responses._count':{'pattern':CMIIndex, 'mod':'r', 'defaultvalue':'0', 'writeerror':'402'},113 'cmi.interactions.n.correct_responses.n.pattern':{'pattern':CMIIndex, 'format':CMIFeedback, 'mod':'w', 'readerror':'404', 'writeerror':'405'},114 'cmi.interactions.n.weighting':{'pattern':CMIIndex, 'format':CMIDecimal, 'range':weighting_range, 'mod':'w', 'readerror':'404', 'writeerror':'405'},115 'cmi.interactions.n.student_response':{'pattern':CMIIndex, 'format':CMIFeedback, 'mod':'w', 'readerror':'404', 'writeerror':'405'},116 'cmi.interactions.n.result':{'pattern':CMIIndex, 'format':CMIResult, 'mod':'w', 'readerror':'404', 'writeerror':'405'},117 'cmi.interactions.n.latency':{'pattern':CMIIndex, 'format':CMITimespan, 'mod':'w', 'readerror':'404', 'writeerror':'405'},118 'nav.event':{'defaultvalue':'', 'format':NAVEvent, 'mod':'w', 'readerror':'404', 'writeerror':'405'}119 };120 }121 var cmi, nav;122 function initdatamodel(scoid){123 prerequrl = cfgwwwroot + "/mod/scorm/prereqs.php?a=" + scormid + "&scoid=" + scoid + "&attempt=" + attempt + "&mode=" + viewmode + "¤torg=" + currentorg + "&sesskey=" + sesskey;124 datamodelurlparams = "id=" + cmid + "&a=" + scormid + "&sesskey=" + sesskey + "&attempt=" + attempt + "&scoid=" + scoid;125 //126 // Datamodel inizialization127 //128 cmi = new Object();129 cmi.core = new Object();130 cmi.core.score = new Object();131 cmi.objectives = new Object();132 cmi.student_data = new Object();133 cmi.student_preference = new Object();134 cmi.interactions = new Object();135 // deprecated evaluation attributes136 cmi.evaluation = new Object();137 cmi.evaluation.comments = new Object();138 // Navigation Object139 nav = new Object();140 for (element in datamodel[scoid]) {141 if (element.match(/\.n\./) == null) {142 if ((typeof eval('datamodel["' + scoid + '"]["' + element + '"].defaultvalue')) != 'undefined') {143 eval(element + ' = datamodel["' + scoid + '"]["' + element + '"].defaultvalue;');144 } else {145 eval(element + ' = "";');146 }147 }148 }149 eval(cmiobj[scoid]);150 eval(cmiint[scoid]);151 if (cmi.core.lesson_status == '') {152 cmi.core.lesson_status = 'not attempted';153 }154 }155 //156 // API Methods definition157 //158 var Initialized = false;159 function LMSInitialize (param) {160 scoid = scorm_current_node ? scorm_current_node.scoid : scoid;161 initdatamodel(scoid);162 errorCode = "0";163 if (param == "") {164 if (!Initialized) {165 Initialized = true;166 errorCode = "0";167 if (scormdebugging) {168 LogAPICall("LMSInitialize", param, "", errorCode);169 }170 return "true";171 } else {172 errorCode = "101";173 }174 } else {175 errorCode = "201";176 }177 if (scormdebugging) {178 LogAPICall("LMSInitialize", param, "", errorCode);179 }180 return "false";181 }182 function LMSFinish (param) {183 errorCode = "0";184 if (param == "") {185 if (Initialized) {186 Initialized = false;187 result = StoreData(cmi,true);188 if (nav.event != '') {189 if (nav.event == 'continue') {190 setTimeout('mod_scorm_launch_next_sco();',500);191 } else {192 setTimeout('mod_scorm_launch_prev_sco();',500);193 }194 } else {195 if (scormauto == 1) {196 setTimeout('mod_scorm_launch_next_sco();',500);197 }198 }199 if (scormdebugging) {200 LogAPICall("LMSFinish", "AJAXResult", result, 0);201 }202 result = ('true' == result) ? 'true' : 'false';203 errorCode = (result == 'true') ? '0' : '101';204 if (scormdebugging) {205 LogAPICall("LMSFinish", "result", result, 0);206 LogAPICall("LMSFinish", param, "", 0);207 }208 // trigger TOC update209 var callback = M.mod_scorm.connectPrereqCallback;210 YUI().use('io-base', function(Y) {211 Y.on('io:complete', callback.success, Y);212 Y.io(prerequrl);213 });214 return result;215 } else {216 errorCode = "301";217 }218 } else {219 errorCode = "201";220 }221 if (scormdebugging) {222 LogAPICall("LMSFinish", param, "", errorCode);223 }224 return "false";225 }226 function LMSGetValue (element) {227 errorCode = "0";228 if (Initialized) {229 if (element != "") {230 expression = new RegExp(CMIIndex,'g');231 elementmodel = String(element).replace(expression,'.n.');232 if ((typeof eval('datamodel["' + scoid + '"]["' + elementmodel + '"]')) != "undefined") {233 if (eval('datamodel["' + scoid + '"]["' + elementmodel + '"].mod') != 'w') {234 element = String(element).replace(expression, "_$1.");235 elementIndexes = element.split('.');236 subelement = 'cmi';237 i = 1;238 while ((i < elementIndexes.length) && (typeof eval(subelement) != "undefined")) {239 subelement += '.' + elementIndexes[i++];240 }241 if (subelement == element) {242 errorCode = "0";243 if (scormdebugging) {244 LogAPICall("LMSGetValue", element, eval(element), 0);245 }246 return eval(element);247 } else {248 errorCode = "0"; // Need to check if it is the right errorCode249 }250 } else {251 errorCode = eval('datamodel["' + scoid + '"]["' + elementmodel + '"].readerror');252 }253 } else {254 childrenstr = '._children';255 countstr = '._count';256 if (elementmodel.substr(elementmodel.length - childrenstr.length,elementmodel.length) == childrenstr) {257 parentmodel = elementmodel.substr(0,elementmodel.length - childrenstr.length);258 if ((typeof eval('datamodel["' + scoid + '"]["' + parentmodel + '"]')) != "undefined") {259 errorCode = "202";260 } else {261 errorCode = "201";262 }263 } else if (elementmodel.substr(elementmodel.length - countstr.length,elementmodel.length) == countstr) {264 parentmodel = elementmodel.substr(0,elementmodel.length - countstr.length);265 if ((typeof eval('datamodel["' + scoid + '"]["' + parentmodel + '"]')) != "undefined") {266 errorCode = "203";267 } else {268 errorCode = "201";269 }270 } else {271 errorCode = "201";272 }273 }274 } else {275 errorCode = "201";276 }277 } else {278 errorCode = "301";279 }280 if (scormdebugging) {281 LogAPICall("LMSGetValue", element, "", errorCode);282 }283 return "";284 }285 function LMSSetValue (element,value) {286 errorCode = "0";287 if (Initialized) {288 if (element != "") {289 expression = new RegExp(CMIIndex,'g');290 elementmodel = String(element).replace(expression,'.n.');291 if ((typeof eval('datamodel["' + scoid + '"]["' + elementmodel + '"]')) != "undefined") {292 if (eval('datamodel["' + scoid + '"]["' + elementmodel + '"].mod') != 'r') {293 expression = new RegExp(eval('datamodel["' + scoid + '"]["' + elementmodel + '"].format'));294 value = value + '';295 matches = value.match(expression);296 if (matches != null) {297 //Create dynamic data model element298 if (element != elementmodel) {299 elementIndexes = element.split('.');300 subelement = 'cmi';301 for (i = 1; i < elementIndexes.length - 1; i++) {302 elementIndex = elementIndexes[i];303 if (elementIndexes[i + 1].match(/^\d+$/)) {304 if ((typeof eval(subelement + '.' + elementIndex)) == "undefined") {305 eval(subelement + '.' + elementIndex + ' = new Object();');306 eval(subelement + '.' + elementIndex + '._count = 0;');307 }308 if (elementIndexes[i + 1] == eval(subelement + '.' + elementIndex + '._count')) {309 eval(subelement + '.' + elementIndex + '._count++;');310 }311 if (elementIndexes[i + 1] > eval(subelement + '.' + elementIndex + '._count')) {312 errorCode = "201";313 }314 subelement = subelement.concat('.' + elementIndex + '_' + elementIndexes[i + 1]);315 i++;316 } else {317 subelement = subelement.concat('.' + elementIndex);318 }319 if ((typeof eval(subelement)) == "undefined") {320 eval(subelement + ' = new Object();');321 if (subelement.substr(0,14) == 'cmi.objectives') {322 eval(subelement + '.score = new Object();');323 eval(subelement + '.score._children = score_children;');324 eval(subelement + '.score.raw = "";');325 eval(subelement + '.score.min = "";');326 eval(subelement + '.score.max = "";');327 }328 if (subelement.substr(0,16) == 'cmi.interactions') {329 eval(subelement + '.objectives = new Object();');330 eval(subelement + '.objectives._count = 0;');331 eval(subelement + '.correct_responses = new Object();');332 eval(subelement + '.correct_responses._count = 0;');333 }334 }335 }336 element = subelement.concat('.' + elementIndexes[elementIndexes.length - 1]);337 }338 //Store data339 if (errorCode == "0") {340 if (autocommit && !(SCORMapi1_2.timeout)) {341 SCORMapi1_2.timeout = Y.later(60000, API, 'LMSCommit', [""], false);342 }343 if ((typeof eval('datamodel["' + scoid + '"]["' + elementmodel + '"].range')) != "undefined") {344 range = eval('datamodel["' + scoid + '"]["' + elementmodel + '"].range');345 ranges = range.split('#');346 value = value * 1.0;347 if ((value >= ranges[0]) && (value <= ranges[1])) {348 eval(element + '=value;');349 errorCode = "0";350 if (scormdebugging) {351 LogAPICall("LMSSetValue", element, value, errorCode);352 }353 return "true";354 } else {355 errorCode = eval('datamodel["' + scoid + '"]["' + elementmodel + '"].writeerror');356 }357 } else {358 if (element == 'cmi.comments') {359 cmi.comments = cmi.comments + value;360 } else {361 eval(element + '=value;');362 }363 errorCode = "0";364 if (scormdebugging) {365 LogAPICall("LMSSetValue", element, value, errorCode);366 }367 return "true";368 }369 }370 } else {371 errorCode = eval('datamodel["' + scoid + '"]["' + elementmodel + '"].writeerror');372 }373 } else {374 errorCode = eval('datamodel["' + scoid + '"]["' + elementmodel + '"].writeerror');375 }376 } else {377 errorCode = "201"378 }379 } else {380 errorCode = "201";381 }382 } else {383 errorCode = "301";384 }385 if (scormdebugging) {386 LogAPICall("LMSSetValue", element, value, errorCode);387 }388 return "false";389 }390 function LMSCommit (param) {391 if (SCORMapi1_2.timeout) {392 SCORMapi1_2.timeout.cancel();393 SCORMapi1_2.timeout = null;394 }395 errorCode = "0";396 if (param == "") {397 if (Initialized) {398 result = StoreData(cmi,false);399 // trigger TOC update400 var callback = M.mod_scorm.connectPrereqCallback;401 YUI().use('io-base', function(Y) {402 Y.on('io:complete', callback.success, Y);403 Y.io(prerequrl);404 });405 if (scormdebugging) {406 LogAPICall("Commit", param, "", 0);407 }408 if (scormdebugging) {409 LogAPICall("LMSCommit", "AJAXResult", result, 0);410 }411 result = ('true' == result) ? 'true' : 'false';412 errorCode = (result == 'true') ? '0' : '101';413 if (scormdebugging) {414 LogAPICall("LMSCommit", "result", result, 0);415 LogAPICall("LMSCommit", "errorCode", errorCode, 0);416 }417 return result;418 } else {419 errorCode = "301";420 }421 } else {422 errorCode = "201";423 }424 if (scormdebugging) {425 LogAPICall("LMSCommit", param, "", 0);426 }427 return "false";428 }429 function LMSGetLastError () {430 if (scormdebugging) {431 LogAPICall("LMSGetLastError", "", "", errorCode);432 }433 return errorCode;434 }435 function LMSGetErrorString (param) {436 if (param != "") {437 var errorString = new Array();438 errorString["0"] = "No error";439 errorString["101"] = "General exception";440 errorString["201"] = "Invalid argument error";441 errorString["202"] = "Element cannot have children";442 errorString["203"] = "Element not an array - cannot have count";443 errorString["301"] = "Not initialized";444 errorString["401"] = "Not implemented error";445 errorString["402"] = "Invalid set value, element is a keyword";446 errorString["403"] = "Element is read only";447 errorString["404"] = "Element is write only";448 errorString["405"] = "Incorrect data type";449 if (scormdebugging) {450 LogAPICall("LMSGetErrorString", param, errorString[param], 0);451 }452 return errorString[param];453 } else {454 if (scormdebugging) {455 LogAPICall("LMSGetErrorString", param, "No error string found!", 0);456 }457 return "";458 }459 }460 function LMSGetDiagnostic (param) {461 if (param == "") {462 param = errorCode;463 }464 if (scormdebugging) {465 LogAPICall("LMSGetDiagnostic", param, param, 0);466 }467 return param;468 }469 function AddTime (first, second) {470 var sFirst = first.split(":");471 var sSecond = second.split(":");472 var cFirst = sFirst[2].split(".");473 var cSecond = sSecond[2].split(".");474 var change = 0;475 FirstCents = 0; //Cents476 if (cFirst.length > 1) {477 FirstCents = parseInt(cFirst[1],10);478 }479 SecondCents = 0;480 if (cSecond.length > 1) {481 SecondCents = parseInt(cSecond[1],10);482 }483 var cents = FirstCents + SecondCents;484 change = Math.floor(cents / 100);485 cents = cents - (change * 100);486 if (Math.floor(cents) < 10) {487 cents = "0" + cents.toString();488 }489 var secs = parseInt(cFirst[0],10) + parseInt(cSecond[0],10) + change; //Seconds490 change = Math.floor(secs / 60);491 secs = secs - (change * 60);492 if (Math.floor(secs) < 10) {493 secs = "0" + secs.toString();494 }495 mins = parseInt(sFirst[1],10) + parseInt(sSecond[1],10) + change; //Minutes496 change = Math.floor(mins / 60);497 mins = mins - (change * 60);498 if (mins < 10) {499 mins = "0" + mins.toString();500 }501 hours = parseInt(sFirst[0],10) + parseInt(sSecond[0],10) + change; //Hours502 if (hours < 10) {503 hours = "0" + hours.toString();504 }505 if (cents != '0') {506 return hours + ":" + mins + ":" + secs + '.' + cents;507 } else {508 return hours + ":" + mins + ":" + secs;509 }510 }511 function TotalTime() {512 total_time = AddTime(cmi.core.total_time, cmi.core.session_time);513 return '&' + underscore('cmi.core.total_time') + '=' + encodeURIComponent(total_time);514 }515 function CollectData(data,parent) {516 var datastring = '';517 for (property in data) {518 if (typeof data[property] == 'object') {519 datastring += CollectData(data[property],parent + '.' + property);520 } else {521 element = parent + '.' + property;522 expression = new RegExp(CMIIndex,'g');523 // get the generic name for this element (e.g. convert 'cmi.interactions.1.id' to 'cmi.interactions.n.id')524 elementmodel = String(element).replace(expression,'.n.');525 // ignore the session time element526 if (element != "cmi.core.session_time") {527 // check if this specific element is not defined in the datamodel,528 // but the generic element name is529 if ((eval('typeof datamodel["' + scoid + '"]["' + element + '"]')) == "undefined"530 && (eval('typeof datamodel["' + scoid + '"]["' + elementmodel + '"]')) != "undefined") {531 // add this specific element to the data model (by cloning532 // the generic element) so we can track changes to it533 eval('datamodel["' + scoid + '"]["' + element + '"]=CloneObj(datamodel["' + scoid + '"]["' + elementmodel + '"]);');534 }535 // check if the current element exists in the datamodel536 if ((typeof eval('datamodel["' + scoid + '"]["' + element + '"]')) != "undefined") {537 // make sure this is not a read only element538 if (eval('datamodel["' + scoid + '"]["' + element + '"].mod') != 'r') {539 elementstring = '&' + underscore(element) + '=' + encodeURIComponent(data[property]);540 // check if the element has a default value541 if ((typeof eval('datamodel["' + scoid + '"]["' + element + '"].defaultvalue')) != "undefined") {542 // check if the default value is different from the current value543 if (eval('datamodel["' + scoid + '"]["' + element + '"].defaultvalue') != data[property]544 || eval('typeof(datamodel["' + scoid + '"]["' + element + '"].defaultvalue)') != typeof(data[property])) {545 // append the URI fragment to the string we plan to commit546 datastring += elementstring;547 // update the element default to reflect the current committed value548 eval('datamodel["' + scoid + '"]["' + element + '"].defaultvalue=data[property];');549 }550 } else {551 // append the URI fragment to the string we plan to commit552 datastring += elementstring;553 // no default value for the element, so set it now554 eval('datamodel["' + scoid + '"]["' + element + '"].defaultvalue=data[property];');555 }556 }557 }558 }559 }560 }561 return datastring;562 }563 function CloneObj(obj){564 if(obj == null || typeof(obj) != 'object') {565 return obj;566 }567 var temp = new obj.constructor(); // changed (twice)568 for(var key in obj) {569 temp[key] = CloneObj(obj[key]);570 }571 return temp;572 }573 function StoreData(data,storetotaltime) {574 if (storetotaltime) {575 if (cmi.core.lesson_status == 'not attempted') {576 cmi.core.lesson_status = 'completed';577 }578 if (cmi.core.lesson_mode == 'normal') {579 if (cmi.core.credit == 'credit') {580 if (cmi.student_data.mastery_score !== '' && cmi.core.score.raw !== '') {581 if (parseFloat(cmi.core.score.raw) >= parseFloat(cmi.student_data.mastery_score)) {582 cmi.core.lesson_status = 'passed';583 } else {584 cmi.core.lesson_status = 'failed';585 }586 }587 }588 }589 if (cmi.core.lesson_mode == 'browse') {590 if (datamodel[scoid]['cmi.core.lesson_status'].defaultvalue == '' && cmi.core.lesson_status == 'not attempted') {591 cmi.core.lesson_status = 'browsed';592 }593 }594 datastring = CollectData(data,'cmi');595 datastring += TotalTime();596 } else {597 datastring = CollectData(data,'cmi');598 }599 var myRequest = NewHttpReq();600 //alert('going to:' + "<?php p($CFG->wwwroot) ?>/mod/scorm/datamodel.php" + "id=<?php p($id) ?>&a=<?php p($a) ?>&sesskey=<?php echo sesskey() ?>"+datastring);601 result = DoRequest(myRequest,datamodelurl,datamodelurlparams + datastring);602 results = String(result).split('\n');603 errorCode = results[1];604 return results[0];605 }606 this.LMSInitialize = LMSInitialize;607 this.LMSFinish = LMSFinish;608 this.LMSGetValue = LMSGetValue;609 this.LMSSetValue = LMSSetValue;610 this.LMSCommit = LMSCommit;611 this.LMSGetLastError = LMSGetLastError;612 this.LMSGetErrorString = LMSGetErrorString;613 this.LMSGetDiagnostic = LMSGetDiagnostic;614}615M.scorm_api = {};616M.scorm_api.init = function(Y, def, cmiobj, cmiint, cmistring256, cmistring4096, scormdebugging, scormauto, scormid, cfgwwwroot, sesskey, scoid, attempt, viewmode, cmid, currentorg, autocommit) {617 window.API = new SCORMapi1_2(def, cmiobj, cmiint, cmistring256, cmistring4096, scormdebugging, scormauto, scormid, cfgwwwroot, sesskey, scoid, attempt, viewmode, cmid, currentorg, autocommit);...
12779.js
Source: 12779.js
...24 });25 });26 describe('logApiCall', () => {27 it('logs the first call without the start marker', () => {28 underTest.logApiCall('svc1.api1');29 expect(fakeConsole.log).toHaveBeenCalledWith('svc1.api1');30 });31 it('logs the second call with the start marker', () => {32 underTest.logApiCall('svc1.api1');33 fakeConsole.log.calls.reset();34 underTest.logApiCall('svc2.api2');35 expect(fakeConsole.log).toHaveBeenCalledWith('[START]svc2.api2');36 });37 it('logs the stage and the api call if the stage is defined', () => {38 underTest.logStage('stage1');39 fakeConsole.log.calls.reset();40 underTest.logApiCall('svc1.api1');41 expect(fakeConsole.log).toHaveBeenCalledWith('[START]stage1\tsvc1.api1');42 });43 it('ignores arguments that are not arrays', () => {44 underTest.logApiCall('svc1.api1', 12345);45 expect(fakeConsole.log).toHaveBeenCalledWith('svc1.api1');46 });47 it('ignores arguments that are empty arrays', () => {48 underTest.logApiCall('svc1.api1', []);49 expect(fakeConsole.log).toHaveBeenCalledWith('svc1.api1');50 });51 it('ignores hash arguments that do not end with ID or Name', () => {52 underTest.logApiCall('svc1.api1', [{ a: 'b' }]);53 expect(fakeConsole.log).toHaveBeenCalledWith('svc1.api1');54 });55 it('logs xxxName arguments', () => {56 underTest.logApiCall('svc1.api1', [{ a: 'b', FunctionName: 'Fun1' }]);57 expect(fakeConsole.log).toHaveBeenCalledWith('svc1.api1\tFunctionName=Fun1');58 });59 it('logs xxxId arguments', () => {60 underTest.logApiCall('svc1.api1', [{ a: 'b', RestApiId: 'Api1' }]);61 expect(fakeConsole.log).toHaveBeenCalledWith('svc1.api1\tRestApiId=Api1');62 });63 it('logs pathXXX arguments', () => {64 underTest.logApiCall('svc1.api1', [{ a: 'b', pathPart: '/XXX' }]);65 expect(fakeConsole.log).toHaveBeenCalledWith('svc1.api1\tpathPart=/XXX');66 });67 it('logs multiple args matching', () => {68 underTest.logApiCall('svc1.api1', [{ a: 'b', FunctionName: 'Fun1', RestApiId: 'YYY' }]);69 expect(fakeConsole.log).toHaveBeenCalledWith('svc1.api1\tFunctionName=Fun1\tRestApiId=YYY');70 });71 });...
array-logger-spec.js
Source: array-logger-spec.js
...22 underTest.logStage('first');23 expect(underTest.getStageLog(true)).toEqual(['first', 'second']);24 });25 it('logs calls to APIs', () => {26 underTest.logApiCall('method1', 'arg1');27 underTest.logApiCall('method2', 'arg2');28 underTest.logApiCall('method1', 'arg1');29 expect(underTest.getApiCallLog()).toEqual(['method1', 'method2', 'method1']);30 });31 it('can return unique API log calls', () => {32 underTest.logApiCall('method1', 'arg1');33 underTest.logApiCall('method2', 'arg2');34 underTest.logApiCall('method1', 'arg2');35 expect(underTest.getApiCallLog(true)).toEqual(['method1', 'method2']);36 });37 it('can filter API calls by service', () => {38 underTest.logApiCall('Api1.method1', 'arg1');39 underTest.logApiCall('Api1.method2', 'arg2');40 underTest.logApiCall('Api2.method3', 'arg2');41 underTest.logApiCall('Api1.method1', 'arg2');42 expect(underTest.getApiCallLogForService('Api1')).toEqual(['Api1.method1', 'Api1.method2', 'Api1.method1']);43 });44 it('can return unique API calls for service', () => {45 underTest.logApiCall('Api1.method1', 'arg1');46 underTest.logApiCall('Api1.method2', 'arg2');47 underTest.logApiCall('Api2.method3', 'arg2');48 underTest.logApiCall('Api1.method1', 'arg2');49 expect(underTest.getApiCallLogForService('Api1', true)).toEqual(['Api1.method1', 'Api1.method2']);50 });51 it('can return a combined log', () => {52 underTest.logStage('creating stuff');53 underTest.logApiCall('Api1.method1', 'arg1');54 underTest.logStage('creating stuff');55 underTest.logStage('deleting stuff');56 underTest.logApiCall('Api1.method1', 'arg1');57 expect(underTest.getCombinedLog()).toEqual([58 ['stage', 'creating stuff'],59 ['call', 'Api1.method1', 'arg1'],60 ['stage', 'creating stuff'],61 ['stage', 'deleting stuff'],62 ['call', 'Api1.method1', 'arg1']63 ]);64 });...
Using AI Code Generation
1const { logApiCall } = require('playwright/lib/server/trace/recorder');2logApiCall('method', 'params');3const { logApiCall } = require('playwright/lib/server/trace/recorder');4logApiCall('method', 'params');5const { logApiCall } = require('playwright/lib/server/trace/recorder');6logApiCall('method', 'params');7const { logApiCall } = require('playwright/lib/server/trace/recorder');8logApiCall('method', 'params');9const { logApiCall } = require('playwright/lib/server/trace/recorder');10logApiCall('method', 'params');11const { logApiCall } = require('playwright/lib/server/trace/recorder');12logApiCall('method', 'params');13const { logApiCall } = require('playwright/lib/server/trace/recorder');14logApiCall('method', 'params');15const { logApiCall } = require('playwright/lib/server/trace/recorder');16logApiCall('method', 'params');17const { logApiCall } = require('playwright/lib/server/trace/recorder');18logApiCall('method', 'params');19const { logApiCall } = require('playwright/lib/server/trace/recorder');20logApiCall('method', 'params');21const { logApiCall } = require('playwright/lib/server/trace/recorder');22logApiCall('method', 'params');
Using AI Code Generation
1const { logApiCall } = require('@playwright/test/lib/server/apiLogger');2logApiCall('test', 'test', 'test');3const { logApiCall } = require('@playwright/test/lib/server/apiLogger');4logApiCall('test', 'test', 'test');5const { logApiCall } = require('@playwright/test/lib/server/apiLogger');6logApiCall('test', 'test', 'test');7const { logApiCall } = require('@playwright/test/lib/server/apiLogger');8logApiCall('test', 'test', 'test');9const { logApiCall } = require('@playwright/test/lib/server/apiLogger');10logApiCall('test', 'test', 'test');11const { logApiCall } = require('@playwright/test/lib/server/apiLogger');12logApiCall('test', 'test', 'test');13const { logApiCall } = require('@playwright/test/lib/server/apiLogger');14logApiCall('test', 'test', 'test');15const { logApiCall } = require('@playwright/test/lib/server/apiLogger');16logApiCall('test', 'test', 'test');17const { logApiCall } = require('@playwright/test/lib/server/apiLogger');18logApiCall('test', 'test', 'test');19const { logApiCall } = require('@playwright/test/lib/server/apiLogger');20logApiCall('test', 'test', 'test');21const { logApiCall } = require('@playwright/test/lib/server/apiLogger');22logApiCall('test', 'test', 'test');23const { logApiCall } = require('@playwright/test/lib/server/apiLogger');24logApiCall('test', '
Using AI Code Generation
1const { logApiCall } = require('playwright/lib/utils/logger');2logApiCall('My custom message', 'My custom data');3const { logApiCall } = require('playwright/lib/utils/logger');4logApiCall('My custom message', 'My custom data');5const { logApiCall } = require('playwright/lib/utils/logger');6logApiCall('My custom message', 'My custom data');7const { logApiCall } = require('playwright/lib/utils/logger');8logApiCall('My custom message', 'My custom data');9const { logApiCall } = require('playwright/lib/utils/logger');10logApiCall('My custom message', 'My custom data');11const { logApiCall } = require('playwright/lib/utils/logger');12logApiCall('My custom message', 'My custom data');13const { logApiCall } = require('playwright/lib/utils/logger');14logApiCall('My custom message', 'My custom data');15const { logApiCall } = require('playwright/lib/utils/logger');16logApiCall('My custom message', 'My custom data');17const { logApiCall } = require('playwright/lib/utils/logger');18logApiCall('My custom message', 'My custom data');19const { logApiCall } = require('playwright/lib/utils/logger');20logApiCall('My custom message', 'My custom data');21const { logApiCall } = require('playwright/lib/utils/logger');22logApiCall('My custom message', 'My custom data');23const { logApiCall } = require('playwright/lib/utils/logger');24logApiCall('My custom message', 'My custom data');25const { logApiCall } = require('playwright/lib/utils/logger');26logApiCall('My custom message', 'My custom data');27const { logApiCall } = require('playwright/lib/utils/logger');28logApiCall('My custom message', 'My custom data');29const { logApiCall } = require('playwright/lib/utils
Using AI Code Generation
1const { logApiCall } = require('playwright-core/lib/server/trace/recorder');2logApiCall('myMethod', 'myParam', 'myResult');3const { test } = require('@playwright/test');4test('test', async ({ page }) => {5});6const { test } = require('@playwright/test');7const { logApiCall } = require('playwright-core/lib/server/trace/recorder');8test('test', async ({ page }) => {9});10const { test } = require('@playwright/test');11test('test', async ({ page }) => {12});13const { test } = require('@playwright/test');14const { logApiCall } = require('playwright-core/lib/server/trace/recorder');15test('test', async ({ page }) => {16});17const { test } = require('@playwright/test');18test('test', async ({ page }) => {19});20const { test } = require('@playwright/test');21const { logApiCall } = require('playwright-core/lib/server/trace/recorder');22test('test', async ({ page }) => {23});24const { test } = require('@playwright/test');25test('test', async ({ page }) => {26});27const { test } = require('@playwright/test');28const { logApiCall } = require('playwright-core/lib/server/trace/recorder');29test('test', async ({ page }) => {
Using AI Code Generation
1const { logApiCall } = require('playwright/lib/utils/DebugLogger');2const fs = require('fs');3const logFile = fs.createWriteStream('log.txt');4logApiCall('method', 'params', 'result', logFile);5const { debug } = require('playwright/lib/utils/DebugLogger');6debug();
Using AI Code Generation
1const { logApiCall } = require('@playwright/test/lib/utils/trace');2logApiCall({ method: 'context.route', args: ['**/*'], returnValue: { route: 'route' } });3logApiCall({ method: 'context.route', args: ['**/*'], returnValue: { route: 'route' } });4logApiCall({ method: 'context.route', args: ['**/*'], returnValue: { route: 'route' } });5logApiCall({ method: 'context.route', args: ['**/*'], returnValue: { route: 'route' } });6logApiCall({ method: 'context.route', args: ['**/*'], returnValue: { route: 'route' } });7logApiCall({ method: 'context.route', args: ['**/*'], returnValue: { route: 'route' } });8logApiCall({ method: 'context.route', args: ['**/*'], returnValue: { route: 'route' } });9logApiCall({ method: 'context.route', args: ['**/*'], returnValue: { route: 'route' } });10logApiCall({ method: 'context.route', args: ['**/*'], returnValue: { route: 'route' } });11logApiCall({ method: 'context.route', args: ['**/*'], returnValue: { route: 'route' } });12logApiCall({ method: 'context.route', args: ['**/*'], returnValue: { route: 'route' } });13logApiCall({ method: 'context.route', args: ['**/*'], returnValue: { route: 'route' } });14logApiCall({ method: 'context.route', args: ['**/*'], returnValue: { route: 'route' } });15logApiCall({ method: 'context.route', args: ['**/*'], returnValue: { route: 'route' } });16logApiCall({ method: 'context.route', args: ['**/*'], returnValue: { route: 'route' } });17logApiCall({ method: 'context.route', args: ['**/*'], returnValue: { route: 'route' } });18logApiCall({ method: 'context.route', args: ['**/*'], returnValue: { route: 'route' } });19logApiCall({ method: 'context.route', args: ['**/*'], returnValue: { route: 'route' } });
Jest + Playwright - Test callbacks of event-based DOM library
firefox browser does not start in playwright
Is it possible to get the selector from a locator object in playwright?
How to run a list of test suites in a single file concurrently in jest?
Running Playwright in Azure Function
firefox browser does not start in playwright
This question is quite close to a "need more focus" question. But let's try to give it some focus:
Does Playwright has access to the cPicker object on the page? Does it has access to the window object?
Yes, you can access both cPicker and the window object inside an evaluate call.
Should I trigger the events from the HTML file itself, and in the callbacks, print in the DOM the result, in some dummy-element, and then infer from that dummy element text that the callbacks fired?
Exactly, or you can assign values to a javascript variable:
const cPicker = new ColorPicker({
onClickOutside(e){
},
onInput(color){
window['color'] = color;
},
onChange(color){
window['result'] = color;
}
})
And then
it('Should call all callbacks with correct arguments', async() => {
await page.goto(`http://localhost:5000/tests/visual/basic.html`, {waitUntil:'load'})
// Wait until the next frame
await page.evaluate(() => new Promise(requestAnimationFrame))
// Act
// Assert
const result = await page.evaluate(() => window['color']);
// Check the value
})
Check out the latest blogs from LambdaTest on this topic:
Native apps are developed specifically for one platform. Hence they are fast and deliver superior performance. They can be downloaded from various app stores and are not accessible through browsers.
One of the essential parts when performing automated UI testing, whether using Selenium or another framework, is identifying the correct web elements the tests will interact with. However, if the web elements are not located correctly, you might get NoSuchElementException in Selenium. This would cause a false negative result because we won’t get to the actual functionality check. Instead, our test will fail simply because it failed to interact with the correct element.
Smartphones have changed the way humans interact with technology. Be it travel, fitness, lifestyle, video games, or even services, it’s all just a few touches away (quite literally so). We only need to look at the growing throngs of smartphone or tablet users vs. desktop users to grasp this reality.
As part of one of my consulting efforts, I worked with a mid-sized company that was looking to move toward a more agile manner of developing software. As with any shift in work style, there is some bewilderment and, for some, considerable anxiety. People are being challenged to leave their comfort zones and embrace a continuously changing, dynamic working environment. And, dare I say it, testing may be the most ‘disturbed’ of the software roles in agile development.
LambdaTest’s Playwright tutorial will give you a broader idea about the Playwright automation framework, its unique features, and use cases with examples to exceed your understanding of Playwright testing. This tutorial will give A to Z guidance, from installing the Playwright framework to some best practices and advanced concepts.
Get 100 minutes of automation test minutes FREE!!