< Summary - Igor Pro Universal Testing Framework

Information
Class: procedures.igortest-test-md-mmd
Assembly: procedures
File(s): /builds/mirror/igortest/procedures/igortest-test-md-mmd.ipf
Tag: 74147b3
Line coverage
7%
Covered lines: 24
Uncovered lines: 284
Coverable lines: 308
Total lines: 462
Line coverage: 7.7%
Branch coverage
50%
Covered branches: 2
Total branches: 4
Branch coverage: 50%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

File(s)

/builds/mirror/igortest/procedures/igortest-test-md-mmd.ipf

#LineLine coverage
 1#pragma rtGlobals=3
 2#pragma TextEncoding="UTF-8"
 3#pragma rtFunctionErrors=1
 4#pragma version=1.10
 5#pragma ModuleName=IUTF_Test_MD_MMD
 6
 7///@cond HIDDEN_SYMBOL
 8
 9static StrConstant DGEN_VAR_TEMPLATE   = "v"
 10static StrConstant DGEN_STR_TEMPLATE   = "s"
 11static StrConstant DGEN_DFR_TEMPLATE   = "dfr"
 12static StrConstant DGEN_WAVE_TEMPLATE  = "w"
 13static StrConstant DGEN_CMPLX_TEMPLATE = "c"
 14static StrConstant DGEN_INT64_TEMPLATE = "i"
 15
 16/// @brief Returns a global wave that stores the multi-multi-data testcase (MMD TC) state waves
 17///        The getter function for the MMD TC state waves is GetMMDFuncState()
 518static Function/WAVE GetMMDataState()
 19
 520  string name = "MMDataState"
 21
 522  DFREF       dfr = GetPackageFolder()
 523  WAVE/Z/WAVE wv  = dfr:$name
 524  if(WaveExists(wv))
 025    return wv
 526  endif
 27
 528  Make/WAVE/N=(IUTF_WAVECHUNK_SIZE) dfr:$name/WAVE=wv
 529  IUTF_Utils_Vector#SetLength(wv, 0)
 30
 531  return wv
 532End
 33
 34/// @brief Returns a global wave that stores the full function names at the same position as in
 35/// MMDataState. This is used to reference full function names and their data.
 536static Function/WAVE GetMMDataStateRefs()
 37
 538  string name = "MMDataStateRefs"
 39
 540  DFREF    dfr = GetPackageFolder()
 541  WAVE/Z/T wv  = dfr:$name
 542  if(WaveExists(wv))
 043    return wv
 544  endif
 45
 546  Make/T/N=(IUTF_WAVECHUNK_SIZE) dfr:$name/WAVE=wv
 547  IUTF_Utils_Vector#SetLength(wv, 0)
 48
 549  return wv
 550End
 51
 52/// @brief Find the current index in the global MMDataState wave.
 53///
 54/// @param fullFuncName the full function name
 55///
 56/// @returns The index inside MMDataState or -1 if not found.
 057static Function GetMMDataStateRef(fullFuncName)
 58  string fullFuncName
 59
 060  WAVE/T wvRefs = GetMMDataStateRefs()
 61
 062  return IUTF_Utils_Vector#FindText(wvRefs, fullFuncName)
 063End
 64
 65/// Creates a global with the allowed variable names for mmd data tests and returns the value
 066static Function/S GetMMDAllVariablesList()
 67
 068  variable i, j, numTemplates
 069  string varName, varList
 70
 071  DFREF dfr = GetPackageFolder()
 072  SVAR/Z/SDFR=dfr mmdAllVariablesList
 73
 074  if(SVAR_EXISTS(mmdAllVariablesList))
 075    return mmdAllVariablesList
 076  endif
 77
 078  varList = ""
 79
 080  WAVE/T templates = GetMMDVarTemplates()
 081  numTemplates = DimSize(templates, UTF_ROW)
 082  for(i = 0; i < numTemplates; i += 1)
 083    for(j = 0; j < IUTF_DGEN_NUM_VARS; j += 1)
 084      varName = templates[i] + num2istr(j)
 085      varList = AddListItem(varName, varList)
 086    endfor
 087  endfor
 88
 089  string/G dfr:mmdAllVariablesList = varList
 90
 091  return varList
 092End
 93
 94///@endcond // HIDDEN_SYMBOL
 95
 7996static Function/WAVE GetMMDVarTemplates()
 97
 7998  Make/FREE/T templates = {DGEN_VAR_TEMPLATE, DGEN_STR_TEMPLATE, DGEN_DFR_TEMPLATE, DGEN_WAVE_TEMPLATE, DGEN_CMPLX_TEMPL
 7999  return templates
 79100End
 101
 0102static Function/WAVE GetMMDFuncState()
 103
 0104  Make/FREE/T/N=(0, 3) mdFunState
 0105  SetDimLabel UTF_COLUMN, 0, DATAGEN, mdFunState
 0106  SetDimLabel UTF_COLUMN, 1, GENSIZE, mdFunState
 0107  SetDimLabel UTF_COLUMN, 2, INDEX, mdFunState
 108
 0109  return mdFunState
 0110End
 111
 0112static Function AddMMDTestCaseData(fullFuncName, dgen, varName, genSize)
 113  string fullFuncName, dgen, varName
 114  variable genSize
 115
 0116  variable funPos, size
 0117  variable varPos, vSize
 118
 0119  WAVE/WAVE mdState = GetMMDataState()
 0120  funPos = GetMMDataStateRef(fullFuncName)
 0121  if(funPos == -1)
 0122    funPos = IUTF_Utils_Vector#AddRow(mdState)
 0123    WAVE/T mdStateRefs = GetMMDataStateRefs()
 0124    IUTF_Utils_Vector#EnsureCapacity(mdStateRefs, funPos)
 0125    IUTF_Utils_Vector#SetLength(mdStateRefs, IUTF_Utils_Vector#GetLength(mdState))
 0126    mdStateRefs[funPos] = fullFuncName
 0127    WAVE/T mdFunState = GetMMDFuncState()
 0128    varPos = -2
 0129  else
 0130    WAVE/T mdFunState = mdState[funPos]
 0131    varPos = FindDimLabel(mdFunState, UTF_ROW, varName)
 0132  endif
 133
 0134  if(varPos == -2)
 0135    vSize = DimSize(mdFunState, UTF_ROW)
 0136    Redimension/N=(vSize + 1, -1) mdFunState
 0137    SetDimLabel UTF_ROW, vSize, $varName, mdFunState
 0138    varPos = vSize
 0139  endif
 0140  mdFunState[varPos][%DATAGEN] = dgen
 0141  mdFunState[varPos][%GENSIZE] = num2istr(genSize)
 0142  mdFunState[varPos][%INDEX]   = num2istr(0)
 0143  mdState[funPos]              = mdFunState
 0144End
 145
 146/// Return 1 if the counting finished, 0 otherwise
 0147static Function IncreaseMMDIndices(fullFuncName)
 148  string fullFuncName
 149
 0150  variable i, numVars, index, genSize, refIndex
 151
 0152  WAVE/WAVE mdState = GetMMDataState()
 0153  refIndex = GetMMDataStateRef(fullFuncName)
 0154  WAVE/T mdFunState = mdState[refIndex]
 0155  numVars = DimSize(mdFunState, UTF_ROW)
 0156  for(i = 0; i < numVars; i += 1)
 0157    index   = str2num(mdFunState[i][%INDEX])
 0158    genSize = str2num(mdFunState[i][%GENSIZE])
 0159    index  += 1
 0160    if(index < genSize)
 0161      mdFunState[i][%INDEX] = num2istr(index)
 0162      return 0
 0163    else
 0164      mdFunState[i][%INDEX] = num2istr(0)
 0165    endif
 0166  endfor
 167
 0168  return 1
 0169End
 170
 0171static Function SetupMMDStruct(mData, fullFuncName)
 172  STRUCT IUTF_mData &mData
 173  string             fullFuncName
 174
 0175  variable i, j, numTypes
 0176  variable funPos, varPos, index, val, refIndex
 0177  variable/C cplx
 0178  string msg, varName, dgen, str
 179#if (IgorVersion() >= 7.0)
 0180  int64 i64
 181#endif
 182
 0183  WAVE/WAVE dgenWaves = IUTF_Test_MD_Gen#GetDataGeneratorWaves()
 0184  WAVE/WAVE mdState   = GetMMDataState()
 0185  WAVE/T    templates = GetMMDVarTemplates()
 186
 0187  refIndex = GetMMDataStateRef(fullFuncName)
 0188  WAVE/T mdFunState = mdState[refIndex]
 189
 0190  numTypes = DimSize(templates, UTF_ROW)
 0191  for(i = 0; i < numTypes; i += 1)
 0192    for(j = 0; j < IUTF_DGEN_NUM_VARS; j += 1)
 0193      varName = templates[i] + num2istr(j)
 0194      varPos  = FindDimLabel(mdFunState, UTF_ROW, varName)
 0195      if(varPos == -2)
 0196        continue
 0197      endif
 0198      dgen  = mdFunState[varPos][%DATAGEN]
 0199      index = str2num(mdFunState[varPos][%INDEX])
 200
 0201      strswitch(templates[i])
 0202        case DGEN_VAR_TEMPLATE:
 0203          refIndex = IUTF_Test_MD_Gen#GetDataGeneratorRef(dgen)
 0204          WAVE wGenerator = dgenWaves[refIndex]
 0205          val = wGenerator[index]
 206
 0207          switch(j)
 0208            case 0:
 0209              mData.v0 = val
 0210              break
 0211            case 1:
 0212              mData.v1 = val
 0213              break
 0214            case 2:
 0215              mData.v2 = val
 0216              break
 0217            case 3:
 0218              mData.v3 = val
 0219              break
 0220            case 4:
 0221              mData.v4 = val
 0222              break
 0223            default:
 0224              IUTF_Reporting#ReportErrorAndAbort("Encountered invalid index for mmd tc")
 0225              break
 0226          endswitch
 0227          break
 0228        case DGEN_STR_TEMPLATE:
 0229          refIndex = IUTF_Test_MD_Gen#GetDataGeneratorRef(dgen)
 0230          WAVE/T wGeneratorT = dgenWaves[refIndex]
 0231          str = wGeneratorT[index]
 232
 0233          switch(j)
 0234            case 0:
 0235              mData.s0 = str
 0236              break
 0237            case 1:
 0238              mData.s1 = str
 0239              break
 0240            case 2:
 0241              mData.s2 = str
 0242              break
 0243            case 3:
 0244              mData.s3 = str
 0245              break
 0246            case 4:
 0247              mData.s4 = str
 0248              break
 0249            default:
 0250              IUTF_Reporting#ReportErrorAndAbort("Encountered invalid index for mmd tc")
 0251              break
 0252          endswitch
 0253          break
 0254        case DGEN_DFR_TEMPLATE:
 0255          refIndex = IUTF_Test_MD_Gen#GetDataGeneratorRef(dgen)
 0256          WAVE/DF wGeneratorDFR = dgenWaves[refIndex]
 0257          DFREF   dfr           = wGeneratorDFR[index]
 258
 0259          switch(j)
 0260            case 0:
 0261              mData.dfr0 = dfr
 0262              break
 0263            case 1:
 0264              mData.dfr1 = dfr
 0265              break
 0266            case 2:
 0267              mData.dfr2 = dfr
 0268              break
 0269            case 3:
 0270              mData.dfr3 = dfr
 0271              break
 0272            case 4:
 0273              mData.dfr4 = dfr
 0274              break
 0275            default:
 0276              IUTF_Reporting#ReportErrorAndAbort("Encountered invalid index for mmd tc")
 0277              break
 0278          endswitch
 0279          break
 0280        case DGEN_WAVE_TEMPLATE:
 0281          refIndex = IUTF_Test_MD_Gen#GetDataGeneratorRef(dgen)
 0282          WAVE/WAVE wGeneratorWV = dgenWaves[refIndex]
 0283          WAVE      wv           = wGeneratorWV[index]
 284
 0285          switch(j)
 0286            case 0:
 0287              WAVE mData.w0 = wv
 0288              break
 0289            case 1:
 0290              WAVE mData.w1 = wv
 0291              break
 0292            case 2:
 0293              WAVE mData.w2 = wv
 0294              break
 0295            case 3:
 0296              WAVE mData.w3 = wv
 0297              break
 0298            case 4:
 0299              WAVE mData.w4 = wv
 0300              break
 0301            default:
 0302              IUTF_Reporting#ReportErrorAndAbort("Encountered invalid index for mmd tc")
 0303              break
 0304          endswitch
 0305          break
 0306        case DGEN_CMPLX_TEMPLATE:
 0307          refIndex = IUTF_Test_MD_Gen#GetDataGeneratorRef(dgen)
 0308          WAVE/C wGeneratorC = dgenWaves[refIndex]
 0309          cplx = wGeneratorC[index]
 310
 0311          switch(j)
 0312            case 0:
 0313              mData.c0 = cplx
 0314              break
 0315            case 1:
 0316              mData.c1 = cplx
 0317              break
 0318            case 2:
 0319              mData.c2 = cplx
 0320              break
 0321            case 3:
 0322              mData.c3 = cplx
 0323              break
 0324            case 4:
 0325              mData.c4 = cplx
 0326              break
 0327            default:
 0328              IUTF_Reporting#ReportErrorAndAbort("Encountered invalid index for mmd tc")
 0329              break
 0330          endswitch
 0331          break
 332#if (IgorVersion() >= 7.0)
 0333        case DGEN_INT64_TEMPLATE:
 0334          refIndex = IUTF_Test_MD_Gen#GetDataGeneratorRef(dgen)
 0335          WAVE wGeneratorI = dgenWaves[refIndex]
 0336          i64 = wGeneratorI[index]
 337
 0338          switch(j)
 0339            case 0:
 0340              mData.i0 = i64
 0341              break
 0342            case 1:
 0343              mData.i1 = i64
 0344              break
 0345            case 2:
 0346              mData.i2 = i64
 0347              break
 0348            case 3:
 0349              mData.i3 = i64
 0350              break
 0351            case 4:
 0352              mData.i4 = i64
 0353              break
 0354            default:
 0355              IUTF_Reporting#ReportErrorAndAbort("Encountered invalid index for mmd tc")
 0356              break
 0357          endswitch
 0358          break
 359#endif
 0360        default:
 0361          IUTF_Reporting#ReportErrorAndAbort("Encountered invalid type for mmd tc")
 0362          break
 0363      endswitch
 0364    endfor
 0365  endfor
 0366End
 367
 368/// @brief Structure for multi data function using multiple data generators
 369#if (IgorVersion() >= 7.0)
 370Structure IUTF_mData
 371  variable v0
 372  variable v1
 373  variable v2
 374  variable v3
 375  variable v4
 376  string s0
 377  string s1
 378  string s2
 379  string s3
 380  string s4
 381  DFREF dfr0
 382  DFREF dfr1
 383  DFREF dfr2
 384  DFREF dfr3
 385  DFREF dfr4
 386  WAVE/WAVE w0
 387  WAVE/WAVE w1
 388  WAVE/WAVE w2
 389  WAVE/WAVE w3
 390  WAVE/WAVE w4
 391  variable/C c0
 392  variable/C c1
 393  variable/C c2
 394  variable/C c3
 395  variable/C c4
 396  int64 i0
 397  int64 i1
 398  int64 i2
 399  int64 i3
 400  int64 i4
 401EndStructure
 402#else
 403Structure IUTF_mData
 404  variable v0
 405  variable v1
 406  variable v2
 407  variable v3
 408  variable v4
 409  string s0
 410  string s1
 411  string s2
 412  string s3
 413  string s4
 414  DFREF dfr0
 415  DFREF dfr1
 416  DFREF dfr2
 417  DFREF dfr3
 418  DFREF dfr4
 419  WAVE/WAVE w0
 420  WAVE/WAVE w1
 421  WAVE/WAVE w2
 422  WAVE/WAVE w3
 423  WAVE/WAVE w4
 424  variable/C c0
 425  variable/C c1
 426  variable/C c2
 427  variable/C c3
 428  variable/C c4
 429EndStructure
 430#endif
 431
 0432static Function/S GetMMDTCSuffix(tdIndex)
 433  variable tdIndex
 434
 0435  variable i, numVars, index, refIndex
 0436  string fullFuncName, dgen, lbl
 0437  string tcSuffix = ""
 438
 0439  WAVE/T    testRunData = IUTF_Basics#GetTestRunData()
 0440  WAVE/WAVE dgenWaves   = IUTF_Test_MD_Gen#GetDataGeneratorWaves()
 0441  WAVE/WAVE mdState     = GetMMDataState()
 442
 0443  fullFuncName = testRunData[tdIndex][%FULLFUNCNAME]
 0444  refIndex     = GetMMDataStateRef(fullFuncName)
 0445  WAVE/T mdFunState = mdState[refIndex]
 446
 0447  numVars = DimSize(mdFunState, UTF_ROW)
 0448  for(i = 0; i < numVars; i += 1)
 0449    dgen     = mdFunState[i][%DATAGEN]
 0450    index    = str2num(mdFunState[i][%INDEX])
 0451    refIndex = IUTF_Test_MD_Gen#GetDataGeneratorRef(dgen)
 0452    WAVE wGenerator = dgenWaves[refIndex]
 0453    lbl = GetDimLabel(wGenerator, UTF_ROW, index)
 0454    if(!IUTF_Utils#IsEmpty(lbl))
 0455      tcSuffix += IUTF_TC_SUFFIX_SEP + lbl
 0456    else
 0457      tcSuffix += IUTF_TC_SUFFIX_SEP + num2istr(index)
 0458    endif
 0459  endfor
 460
 0461  return tcSuffix
 0462End